2021-08-26:长度为N的数组arr,一定可以组成N^2个数字对。例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2,1) (2,2),也就是任意两个数都可以,而且自己和自己也算数字对,数字对怎么排序?第一维数据从小到大;第一维数据一样的,第二维数组也从小到大,所以上面的数值对排序的结果为:(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)(3,3)。给定一个数组arr,和整数k,返回第k小的数值对。

福大大 答案2021-08-26:

1.暴力解。
时间复杂度:(N^2 * log(N^2)).
2.下标定位+bfprt算法。
2.1.k–。
2.2.定位下标i1和i2。
i1=k/N。
i2=k%N。
2.3.根据bfprt算法求出第i1小和第i2小的数。
时间复杂度:O(N)。
空间复杂度:O(1)。arr数组里的元素顺序会发生变化。

代码用golang编写。代码如下:

package main

import (
"fmt"
"math/rand"
) func main() {
arr := []int{1, 2, 3}
k := 4
ret := kthMinPair3(arr, k)
fmt.Println(ret)
} // O(N)的复杂度,你肯定蒙了
func kthMinPair3(arr []int, k int) []int {
N := len(arr)
if k > N*N {
return nil
}
// 在无序数组中,找到第K小的数,返回值
// 第K小,以1作为开始
fristNum := getMinKth(arr, (k-1)/N)
// 第1维数字
lessFristNumSize := 0
fristNumSize := 0
for i := 0; i < N; i++ {
if arr[i] < fristNum {
lessFristNumSize++
}
if arr[i] == fristNum {
fristNumSize++
}
}
rest := k - (lessFristNumSize * N)
return []int{fristNum, getMinKth(arr, (rest-1)/fristNumSize)}
} // 改写快排,时间复杂度O(N)
// 在无序数组arr中,找到,如果排序的话,arr[index]的数是什么?
func getMinKth(arr []int, index int) int {
L := 0
R := len(arr) - 1
pivot := 0
var range2 []int
for L < R {
pivot = arr[L+rand.Intn(R-L+1)]
range2 = partition(arr, L, R, pivot)
if index < range2[0] {
R = range2[0] - 1
} else if index > range2[1] {
L = range2[1] + 1
} else {
return pivot
}
}
return arr[L]
} func partition(arr []int, L int, R int, pivot int) []int {
less := L - 1
more := R + 1
cur := L
for cur < more {
if arr[cur] < pivot {
less++
arr[less], arr[cur] = arr[cur], arr[less]
cur++
} else if arr[cur] > pivot {
arr[cur], arr[more] = arr[more], arr[cur]
more--
} else {
cur++
}
}
return []int{less + 1, more - 1}
}

执行结果如下:


左神java代码

2021-08-26:长度为N的数组arr,一定可以组成N^2个数字对。例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2的更多相关文章

  1. 2021.08.09 P4868 Preprefix sum(树状数组)

    2021.08.09 P4868 Preprefix sum(树状数组) P4868 Preprefix sum - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 前缀和(pr ...

  2. 2021.08.09 P6225 抑或橙子(树状数组)

    2021.08.09 P6225 抑或橙子(树状数组) 重点: 1.异或用法 题意: Janez 喜欢橙子!他制造了一个橙子扫描仪,但是这个扫描仪对于扫描的每个橙子的图像只能输出一个 3232 位整数 ...

  3. 2021.08.30 前缀函数和KMP

    2021.08.30 前缀函数和KMP KMP算法详解-彻底清楚了(转载+部分原创) - sofu6 - 博客园 (cnblogs.com) KMP算法next数组的一种理解思路 - 挠到头秃 - 博 ...

  4. 2021.08.06 P4392 Sound静音问题(ST表)

    2021.08.06 P4392 Sound静音问题(ST表) [P4392 BOI2007]Sound 静音问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 序列a,求 ...

  5. GNU C的定义长度为0的数组

    在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0];很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在 ...

  6. 不用循环,、es6创建一个长度为100的数组

    问题描述:在不使用循环的条件下,如何创建一个长度为100的数组,并且数组的每一个元素是该元素的下标? 结果为: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1 ...

  7. 前端面试题:不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标,,怎么实现好?

    昨天,看这道题,脑子锈住了,就是没有思路,没看明白是什么意思?⊙﹏⊙|∣今天早上起床,想到需要思考一下这个问题. 当然,我没想明白为什么要这样做?(创建一个长度为100的数组,并且每个元素的值等于它的 ...

  8. 2021.08.09 P6037 Ryoku的探索(基环树)

    2021.08.09 P6037 Ryoku的探索(基环树) P6037 Ryoku 的探索 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.树的性质 2.基环树的性质 ...

  9. 2021.08.05 P5357 康托展开模板(康托展开)

    2021.08.05 P5357 康托展开模板(康托展开) P5367 [模板]康托展开 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.康托展开 算法学习笔记(56): ...

  10. 2021.07.26 P1022 计算器的改良(字符串)

    2021.07.26 P1022 计算器的改良(字符串) 改进: 如果是我出题,我一定把未知数设为ab.buh.bluesky之类的长度不只是1的字符串! 题意: 一个一元一次方程,求解. 分析: 1 ...

随机推荐

  1. 记录小程序字符串模板渲染WxParse

    1.先去https://github.com/icindy/wxParse上downLoad代码,然后直接复制到项目里,跟pages目录同级 2.在要用的js页面声明 var WxParse = re ...

  2. 7. 基础增删改 - 创建管理员用Model-Drive App管理后台信息 - 在Model-Driven App中创建视图

    ​ 当我们创建完Model-Driven之后,就可以在里面创建我们所需要的视图,视图一般分为三类: 个人:根据自己的个人需求创建个人视图,只有创建者和其分享的人才能查看这些视图. 公共:可以根据团体需 ...

  3. 《MySQL是怎样运行的》第五章小结

  4. DVWA-Brute Force(暴力破解)

    暴力破解漏洞,没有对登录框做登录限制,攻击者可以不断的尝试暴力枚举用户名和密码 LOW 审计源码 <?php // 通过GET请求获取Login传参, // isset判断一个变量是否已设置,判 ...

  5. Activiti7开发(四)-我的待办

    目录 1. 查询登录用户的待办任务 2.审批 1. 查询登录用户的待办任务 private List<Task> queryMyTasks(){ String username = Sec ...

  6. Day04笔记

    01.explicit的作用(了解) class Maker { public: //explicit只能放在构造函数前面,构造函数只有一个参数或其他参数有默认值时 explicit Maker(in ...

  7. 【公式编辑测试】生成函数常用性质及其他(普通生成函数指数生成函数Dirichlet生成函数)

    目录 定义 普通生成函数OGF 指数生成函数 EGF Dirichlet生成函数 Notation OGF OGF property some OGF instances EGF EGF proper ...

  8. ArchLinux 作业系统安装教程

    如果你能看到此文,想必你一定玩过不少的发行商发行的 Linux 作业系统或者听说过很多发行商发行的 Linux 作业系统.如果你玩过不少的 Linux 作业系统,对于安装系统可谓是轻车熟路,就是闭着眼 ...

  9. 使用golang+antlr4构建一个自己的语言解析器(一)

    Antlr4 简介 ANTLR(全名:ANother Tool for Language Recognition)是基于LL(*)算法实现的语法解析器生成器(parser generator),用Ja ...

  10. 集合-HashMap 源码详细分析(JDK1.8)

    1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...