`
蒙面考拉
  • 浏览: 160611 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

排序数组中和为给定值的两个数字(07)【简单】

 
阅读更多

题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。

例如输入数组12471115和数字15。由于4+11=15,因此输出411

分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字。可惜这种思路需要的时间复杂度是O(n2)

我们假设现在随便在数组中找到两个数。如果它们的和等于输入的数字,那太好了,我们找到了要找的两个数字;如果小于输入的数字呢?我们希望两个数字的和再大一点。由于数组已经排好序了,我们是不是可以把较小的数字的往后面移动一个数字?因为排在后面的数字要大一些,那么两个数字的和也要大一些,就有可能等于输入的数字了;同样,当两个数字的和大于输入的数字的时候,我们把较大的数字往前移动,因为排在数组前面的数字要小一些,它们的和就有可能等于输入的数字了。

我们把前面的思路整理一下:最初我们找到数组的第一个数字和最后一个数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个数字的和小于数字时,把较小的数字往后移动;当相等时,打完收工。这样扫描的顺序是从数组的两端向数组的中间扫描。

问题是这样的思路是不是正确的呢?这需要严格的数学证明。感兴趣的读者可以自行证明一下。

参考代码:

///////////////////////////////////////////////////////////////////////
// Find two numbers with a sum in a sorted array
// Output: ture is found such two numbers, otherwise false
///////////////////////////////////////////////////////////////////////
bool FindTwoNumbersWithSum
(
      int data[],           // a sorted array
      unsigned int length,  // the length of the sorted array     
      int sum,              // the sum
      int& num1,            // the first number, output
      int& num2             // the second number, output
)
{

      bool found = false;
      if(length < 1)
            return found;

      int ahead = length - 1;
      int behind = 0;

      while(ahead > behind)
      {
            long long curSum = data[ahead] + data[behind];

            // if the sum of two numbers is equal to the input
            // we have found them
            if(curSum == sum)
            {
                  num1 = data[behind];
                  num2 = data[ahead];
                  found = true;
                  break;
            }
            // if the sum of two numbers is greater than the input
            // decrease the greater number
            else if(curSum > sum)
                  ahead --;
            // if the sum of two numbers is less than the input
            // increase the less number
            else
                  behind ++;
      }

      return found;
}

分享到:
评论

相关推荐

    用matlab如何求出一个数组中最接近某个数的五个数

    首先,我们需要一个包含多个数值的数组,假设这个数组为`array`,我们要找的是最接近某个目标值`target`的五个数。`target`可以是用户指定的任意数值。 1. **预处理**:确保`array`中不包含重复元素,如果包含,...

    LeetCode初级算法-数组(手写)

    问题描述:给定两个数组,编写函数计算它们的交集。 解决方法:将两个数组分别排序,然后使用两个指针分别遍历两个数组,比较当前指针指向的元素,根据比较结果移动指针,将所有交集中的元素放入结果集中。 7. 加一...

    LeetCode刷题记录(简单-数组)

    **题解**: 给定两个已排序的数组,将它们合并成一个已排序的数组。 **算法**: - 从两个数组的末尾开始,比较两个数组中的元素大小,将较大的元素放入第一个数组的末尾。 - 使用三个指针分别指向两个数组的末尾和第...

    java算法题 : 数组相关问题

    1. 两数之和:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。这可以通过哈希表实现,时间复杂度为O(n)。 2. 最大子数组和:寻找数组中连续子数组的最大和,Kadane's算法可以在一次遍历中解决,时间...

    【LeeCode】初级算法案例+java代码(数组篇)(csdn)————程序.pdf

    给定一个整数数组和一个目标值,找到数组中和为目标值的那两个整数。可以使用哈希表来存储每个元素及其索引,然后检查每个元素,看它的补数(目标值减去它)是否在哈希表中。 这些初级算法案例旨在帮助初学者理解和...

    算法-leetcode-剑指offer上的题很多

    - **两数之和(2 Sum)**: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 - **数组的K个数之和(Subarray Sum K)**: 给定一个整数数组和一个整数 k,...

    算法学习笔记

    - Search for a Range:在排序数组中搜索给定值的起始和结束位置。 - Find Peak Element:在一个整数数组中找到一个峰值元素。 - Median of Two Sorted Arrays:两个排序数组的中位数。 - Sqrt(x):计算并返回x的...

    判断链表是否为回文链表leetcode-LeetCode:力码

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 给定一个 32 位有符号整数,将整数中的数字进行反转 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数 给定...

    判断链表是否为回文链表leetcode-lintCode:代码

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 给定一个 32 位有符号整数,将整数中的数字进行反转 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数 给定...

    python-leetcode面试题解之两数之和TwoSum.zip

    给定一个整数数组`nums`和一个目标值`target`,请你找出数组中和为目标值的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 **基础解决方案:** 最...

    LeetCode算法设计

    1. **两数求和问题[E]**:给定一个已排序的整数数组`nums`和一个目标值`target`,找出数组中和为目标值的那两个整数,并返回它们的数组下标。这道题可以通过设定两个指针分别指向数组的首尾,然后根据当前和与目标值...

    文档python数组双指针算法求和问题LeetCode2sum3sum4sum含代码

    给定一个整数数组`nums`和一个目标值`target`,请找出数组中和为目标值的两个整数,并返回它们的数组下标。 **解决方案:** - **排序+双指针法**:首先对数组进行排序,然后使用双指针法寻找两个数之和等于目标值的...

    剑指offer(牛客网)

    42. 和为S的两个数字:找出两个数,使得它们的和为给定值。 43. 左旋转字符串:将字符串左旋转指定的步数。 44. 翻转单词顺序列:将字符串中的单词翻转。 45. 扑克牌顺子:判断给定的扑克牌是否能组成顺子。 46....

    LeetCode判断字符串是否循环-LeetCodeForCZY:LeetCode的解决方案

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 9、回文数:(IsPalindrome) 判断一个整数是否是回文数。 14、最长公共前缀:...

    程序员面试100题数据结构和算法

    10. **查找排序数组中和为给定值的两个数字**:这是经典的“两数之和”问题,使用哈希表可以在O(n)的时间内找到解。 11. **二元查找树镜像**:将二元查找树的结构反转,使得左子树变为右子树,右子树变为左子树。...

    数据结构与算法题解

    - 找出数组中和最接近0的连续子数组。 - **RecoverRotatedSortedArray** - 恢复旋转排序后的数组。 - **ProductofArrayExcludeItself** - 求出数组中除了当前元素外所有其他元素的乘积。 - **PartitionArray** -...

    查找和最小的K对数字(python)1

    在给定的编程问题中,任务是找到两个已排序整数数组 `nums1` 和 `nums2` 中和最小的 `k` 对数字。这个问题属于算法的范畴,具体是组合优化问题,通常在数据结构和算法的学习中作为 LeetCode 等在线编程平台上的挑战...

    题目列表1

    - 题目描述:给定两个非空链表表示两个非负整数,将它们相加。 - 解决方案:从尾部到头部逐位相加,处理进位,并创建新的链表节点。 3. **Longest Substring Without Repeating Characters** (滑动窗口/哈希表) ...

Global site tag (gtag.js) - Google Analytics