爪哇2博客
爪哇2博客

给定一个已排序的数组和一个数字x,在数组中找到总和最接近x的对

如果您想练习数据结构和算法程序,可以通过 数据结构和算法面试题.

问题:

给定一个已排序的数组,我们需要找到一个对,其和与Array中的数字X接近。
例如:

1
2
3
4
 
数组[]={-40,-5,1,3,6,7,8,20};
谁的 最近的 5 :  1 3
 

解决方案:

解决方案1:

您可以检查每一对数字并找到接近X的总和。
爪哇代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
上市 静态的 虚空 findPairWithClosestToXBruteForce(整型 rr[],整型 X)
{
    如果(rr.长度<2)
        返回;
    //假设第一个两个元素的X差异最小
    整型 MinimumDiff=数学.腹肌(rr[0]+rr[1]-X);
    整型 对1stIndex=0;
    整型 对2ndIndex=1;
    对于 (整型 i = 0; i < rr.长度; i++) {
        对于 (整型 j = i+1; j < rr.长度; j++) {
            整型 tempDiff=数学.腹肌(rr[i]+rr[j]-X);
 
            如果(tempDiff< MinimumDiff)
            {
                对1stIndex=i;
                对2ndIndex=j;
                MinimumDiff=tempDiff;
            }
        }
    }
    系统..打印(“使用暴力法,其和最接近X的对:”+rr[对1stIndex]++ rr[对2ndIndex]);
}
 

 Solution 2:

  • 我们将维护两个索引,一个索引在开头(l = 0),另一个在结尾(r = n-1)
  • 重复直到 <  r
  • 将差异计算为arr [l] + rr [r] -x
  • 如果绝对(差异) < minDiff then update the minimum 和 和 对.
  • 如果arr [l] + rr [r]小于X,这意味着如果我们想找到与X接近的和,请执行r–
  • 如果arr [l] + rr [r]大于0,这意味着如果我们想找到和X接近的和,请执行l ++
爪哇代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
上市 静态的 虚空 findPairWithClosestToX(整型 rr[],整型 X) {
 
    整型 MinimumDiff = 整数.MAX_VALUE;
    整型 n=rr.长度;
    如果(n<0)
        返回;
    //左右索引变量
    整型 l = 0, r = n-1;
 
    //变量,以跟踪左侧和右侧对的minimumSum
    整型 minLeft = l, minRight = n-1;
 
    (l < r)
    {
 
        整型 currentDiff= 数学.腹肌(rr[l] + rr[r]-X);
        / *如果abs(diff)小于min dif,我们需要更新总和并配对* /
        如果(currentDiff < MinimumDiff)
        {
            MinimumDiff = currentDiff;
            minLeft = l;
            minRight = r;
        }
        如果(rr[l] + rr[r] < X)
            l++;
        其他
            r-;
    }
 
    系统..打印(“总和最接近X的对:”+rr[minLeft]++ rr[minRight]);
}
 

时间复杂度:O(NLogN)

爪哇程序查找总和最接近X的一对:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
组织.Arpit.爪哇2blog;
 
上市 FindPairClosestToXMain {
 
    上市 静态的 虚空 主要([] args)
    {
        整型 数组[]={-40,-5,1,3,6,7,8,20};
        findPairWithClosestToXBruteForce(数组,5);
        findPairWithClosestToX(数组,5);
    }
    上市 静态的 虚空  findPairWithClosestToXBruteForce(整型 rr[],整型 X)
    {
        如果(rr.长度<2)
            返回;
        //假设第一个两个元素的X差异最小
        整型 MinimumDiff=数学.腹肌(rr[0]+rr[1]-X);
        整型 对1stIndex=0;
        整型 对2ndIndex=1;
        对于 (整型 i = 0; i < rr.长度; i++) {
            对于 (整型 j = i+1; j < rr.长度; j++) {
                整型 tempDiff=数学.腹肌(rr[i]+rr[j]-X);
 
                如果(tempDiff< MinimumDiff)
                {
                    对1stIndex=i;
                    对2ndIndex=j;
                    MinimumDiff=tempDiff;
                }
            }
        }
        系统..打印(“使用暴力法,其和最接近X的对:”+rr[对1stIndex]++ rr[对2ndIndex]);
    }
 
    上市 静态的 虚空 findPairWithClosestToX(整型 rr[],整型 X) {
 
        整型 MinimumDiff = 整数.MAX_VALUE;
        整型 n=rr.长度;
        如果(n<0)
            返回;
        //左右索引变量
        整型 l = 0, r = n-1;
 
        //变量,以跟踪左侧和右侧对的minimumSum
        整型 minLeft = l, minRight = n-1;
 
        (l < r)
        {
 
            整型 currentDiff= 数学.腹肌(rr[l] + rr[r]-X);
            / *如果abs(diff)小于min dif,我们需要更新总和并配对* /
            如果(currentDiff < MinimumDiff)
            {
                MinimumDiff = currentDiff;
                minLeft = l;
                minRight = r;
            }
            如果(rr[l] + rr[r] < X)
                l++;
            其他
                r-;
        }
 
        系统..打印(“总和最接近X的对:”+rr[minLeft]++ rr[minRight]);
    }
}
 

当您运行上述程序时,将获得以下输出:

1
2
3
4
 
   谁的 最近的 X 使用 蛮力 方法: 1 3
谁的 最近的 X : 1 3
 


导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

  • 3月28日

    对0、1和2的数组进行排序

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何对0、1和2s的数组进行排序。我们已经看到了有关对数组中的0s和1s进行排序的文章。问题给定一个包含零的数组,[…]

  • 3月04

    通过跳转检查是否有可能到达给定数组的末尾

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。问题给定一个具有正整数作为元素的数组,该数组指示可以从数组中任何位置进行跳转的最大长度。检查是否可以[…]

  • 2月17日

    检查数组元素是否连续

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何检查数组元素是否连续。问题给定一个数组,我们需要检查数组是否包含连续的元素。例如:输入:array [] = {5,3,4,[…]

  • 11月1日

    在数组中找到局部最小值

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何在数组中找到局部最小值。问题如果一个元素小于其相邻元素,则它是局部最小值。 整型 [] rr = {10,5,3,[…]

  • 10月22日

    爪哇中的滑动窗口最大值

    在这篇文章中,我们将看到有关Java问题中滑动窗口最大值的问题给定一个整数数组和一个整数k,请从所有大小为K的连续子数组中找到max的元素。例如:Input:int [] rr = {2 ,6,-1,2,4,1,-6,5} 整型 k = 3输出:[[]的每个子数组分别为6,6,4,4,4,5,5…]

  • 10月20日

    计算排序数组中每个元素的出现次数(或频率)

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何计算已排序数组中每个元素的出现次数(或出现频率)问题给定一个包含重复项的整数排序数组。找出每个[…]

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客