2022-01-28:比如{ 5, 3, 1, 4 } 全部数字对是:(5,3)(5,1)(5,4)(3,1)(3,4)(1,4) 数字对的差值绝对值: 241213 差值绝对值排

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-01-28:比如{ 5, 3, 1, 4 } 全部数字对是:(5,3)(5,1)(5,4)(3,1)(3,4)(1,4) 数字对的差值绝对值: 241213 差值绝对值排相关的知识,希望对你有一定的参考价值。

2022-01-28:比如 5, 3, 1, 4
全部数字对是:(5,3)、(5,1)、(5,4)、(3,1)、(3,4)、(1,4)
数字对的差值绝对值: 2、4、1、2、1、3
差值绝对值排序后:1、1、2、2、3、4
给定一个数组arr,和一个正数k
返回arr中所有数字对差值的绝对值,第k小的是多少
arr = 5, 3, 1, 4 , k = 4
返回2

答案2022-01-28:

排序+二分+不回退。
时间复杂度:O(log(大-小))*O(N)。
空间复杂度:O(1)。

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

package main

import (
    "fmt"
    "sort"
)

func main() 
    fmt.Println(kthABS2([]int5, 3, 1, 4, 4))


// 二分 + 不回退
func kthABS2(arr []int, k int) int 
    n := len(arr)
    if n < 2 || k < 1 || k > ((n*(n-1))>>1) 
        return -1
    
    sort.Ints(arr)
    // 0 ~ 大-小 二分
    // l  ~  r
    left := 0
    right := arr[n-1] - arr[0]
    mid := 0
    rightest := -1
    for left <= right 
        mid = (left + right) / 2
        // 数字对差值的绝对值<=mid的数字对个数,是不是 < k个的!
        if valid(arr, mid, k) 
            rightest = mid
            left = mid + 1
         else 
            right = mid - 1
        
    
    return rightest + 1


// 假设arr中的所有数字对,差值绝对值<=limit的个数为x
// 如果 x < k,达标,返回true
// 如果 x >= k,不达标,返回false
func valid(arr []int, limit, k int) bool 
    x := 0
    for l, r := 0, 1; l < len(arr); r = getMax(r, l) 
        for r < len(arr) && arr[r]-arr[l] <= limit 
            r++
        
        x += r - l - 1
        l++
    
    return x < k


func getMax(a, b int) int 
    if a > b 
        return a
     else 
        return b
    

执行结果如下:


左神java代码

以上是关于2022-01-28:比如{ 5, 3, 1, 4 } 全部数字对是:(5,3)(5,1)(5,4)(3,1)(3,4)(1,4) 数字对的差值绝对值: 241213 差值绝对值排的主要内容,如果未能解决你的问题,请参考以下文章

2022-05-07:返回一个数组中,所有降序三元组的数量。 比如 : {5, 3, 4, 2, 1}, 所有降序三元组为 : {5, 3, 2}{5, 3, 1}{5, 4, 2}{5, 4

java中使用mybatis和oracle 查询数据时比如我第一次点击页面查询 返回1,2

对于求集合种类的题目有啥方法(公式)?比如A=1,2,3,4,5,6,B=4,5,6,7

Python 列表元素分组,比如 [1,2,3,...100]变成 [[1,2,3],[4,5,6]....](列表生成式解决)

2021-07-17:一个不含有负数的数组可以代表一圈环形山,每个位置的值代表山的高度。比如, {3,1,2,4,5}{4,5,3,1,2}或{1,2,4,5,3}都代表同样结构的环形山。山峰A和山(

web安全,mysql注入的时候,比如 ***.php?id=5 union select 1,2,3,4。。。如果返回正常