题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的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;
}
发表评论
-
析构函数为虚函数的原因
2012-09-09 11:42 832我们知道,用C++开发的时候,用来做基类的类的析构函数 ... -
hash的应用
2012-08-31 23:02 962第一部分为一道百度面试题Top K算法的详解;第二部分为关 ... -
微软智力题
2012-08-29 19:59 567第一组1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有 ... -
C++不能被继承的类
2012-08-27 20:16 1059一个类不能被继承, ... -
括号对齐问题
2012-08-27 10:47 1410解法一:左右括号成一对则抵消 可以 ... -
树的遍历
2012-08-19 10:43 719/****************************** ... -
堆排序
2012-08-16 14:24 884堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全 ... -
多态赋值
2012-08-14 16:16 832#include <iostream> usi ... -
static变量与static函数(转)
2012-08-13 10:15 746一、 static 变量 static变量大致分为三种用法 ... -
不用sizeof判断16位32位
2012-08-10 15:21 1704用C++写个程序,如何判断一个操作系统是16位还是3 ... -
找出连续最长的数字串(百度面试)
2012-08-09 15:15 1146int maxContinuNum(const char*in ... -
顺序栈和链栈
2012-08-06 10:01 800顺序栈:话不多说直接上代码 #include ... -
队列的数组实现和链表实现
2012-08-05 16:20 1026话不多少,数组实现上代码: #include<i ... -
KMP算法详解
2012-08-02 21:40 888KMP算法: 是在一个“主文本字符串” ... -
字符串的最长连续重复子串
2012-08-01 15:05 9780两种方法: 循环两次寻找最长的子串: <方法一> ... -
寻找一个字符串连续出现最多的子串的方法(转)
2012-07-31 21:19 986算法描述首先获得后缀数组,然后1.第一行第一个字符a,与第二行 ... -
字符串的循环移位
2012-07-31 16:52 975假设字符串:abcdefg 左循环两位:cdefgab 右 ... -
一次谷歌面试趣事(转)
2012-07-31 15:26 767很多年前我进入硅谷 ... -
约瑟夫环问题(循环链表)
2012-07-30 21:31 1291题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1, ... -
面试之单链表
2012-07-30 20:18 7281、编程实现一个单链表的建立/测长/打印。 ...
相关推荐
首先,我们需要一个包含多个数值的数组,假设这个数组为`array`,我们要找的是最接近某个目标值`target`的五个数。`target`可以是用户指定的任意数值。 1. **预处理**:确保`array`中不包含重复元素,如果包含,...
问题描述:给定两个数组,编写函数计算它们的交集。 解决方法:将两个数组分别排序,然后使用两个指针分别遍历两个数组,比较当前指针指向的元素,根据比较结果移动指针,将所有交集中的元素放入结果集中。 7. 加一...
**题解**: 给定两个已排序的数组,将它们合并成一个已排序的数组。 **算法**: - 从两个数组的末尾开始,比较两个数组中的元素大小,将较大的元素放入第一个数组的末尾。 - 使用三个指针分别指向两个数组的末尾和第...
1. 两数之和:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。这可以通过哈希表实现,时间复杂度为O(n)。 2. 最大子数组和:寻找数组中连续子数组的最大和,Kadane's算法可以在一次遍历中解决,时间...
给定一个整数数组和一个目标值,找到数组中和为目标值的那两个整数。可以使用哈希表来存储每个元素及其索引,然后检查每个元素,看它的补数(目标值减去它)是否在哈希表中。 这些初级算法案例旨在帮助初学者理解和...
- **两数之和(2 Sum)**: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 - **数组的K个数之和(Subarray Sum K)**: 给定一个整数数组和一个整数 k,...
- Search for a Range:在排序数组中搜索给定值的起始和结束位置。 - Find Peak Element:在一个整数数组中找到一个峰值元素。 - Median of Two Sorted Arrays:两个排序数组的中位数。 - Sqrt(x):计算并返回x的...
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 给定一个 32 位有符号整数,将整数中的数字进行反转 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数 给定...
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 给定一个 32 位有符号整数,将整数中的数字进行反转 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数 给定...
给定一个整数数组`nums`和一个目标值`target`,请你找出数组中和为目标值的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 **基础解决方案:** 最...
1. **两数求和问题[E]**:给定一个已排序的整数数组`nums`和一个目标值`target`,找出数组中和为目标值的那两个整数,并返回它们的数组下标。这道题可以通过设定两个指针分别指向数组的首尾,然后根据当前和与目标值...
给定一个整数数组`nums`和一个目标值`target`,请找出数组中和为目标值的两个整数,并返回它们的数组下标。 **解决方案:** - **排序+双指针法**:首先对数组进行排序,然后使用双指针法寻找两个数之和等于目标值的...
42. 和为S的两个数字:找出两个数,使得它们的和为给定值。 43. 左旋转字符串:将字符串左旋转指定的步数。 44. 翻转单词顺序列:将字符串中的单词翻转。 45. 扑克牌顺子:判断给定的扑克牌是否能组成顺子。 46....
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 9、回文数:(IsPalindrome) 判断一个整数是否是回文数。 14、最长公共前缀:...
10. **查找排序数组中和为给定值的两个数字**:这是经典的“两数之和”问题,使用哈希表可以在O(n)的时间内找到解。 11. **二元查找树镜像**:将二元查找树的结构反转,使得左子树变为右子树,右子树变为左子树。...
- 找出数组中和最接近0的连续子数组。 - **RecoverRotatedSortedArray** - 恢复旋转排序后的数组。 - **ProductofArrayExcludeItself** - 求出数组中除了当前元素外所有其他元素的乘积。 - **PartitionArray** -...
在给定的编程问题中,任务是找到两个已排序整数数组 `nums1` 和 `nums2` 中和最小的 `k` 对数字。这个问题属于算法的范畴,具体是组合优化问题,通常在数据结构和算法的学习中作为 LeetCode 等在线编程平台上的挑战...
- 题目描述:给定两个非空链表表示两个非负整数,将它们相加。 - 解决方案:从尾部到头部逐位相加,处理进位,并创建新的链表节点。 3. **Longest Substring Without Repeating Characters** (滑动窗口/哈希表) ...