快速找出一个数组中的两个数字,其和等于给定值。
2013-07-01 09:15
429 查看
快速找出一个数组中的两个数字,其和等于给定值。
解法1:穷举法,时间复杂度O(N);
解法2:变通思路,对数组中的每个数字arr[i]都判别sum-arr[i]在不在数组中。这样就变通为一个查找算法。将数组排序,需要时间O(N*logN)。对于每个arr[i]用二分法查找sum-arr[i]的时间复杂度都为O(logN),总计N*O(logN)+ O(N*logN)= O(N*logN)。
当然也可以用hash的方法简化查找,但是空间效率加大了。
解法3:首先对数组进行排序,时间复杂度为O(N*logN)。
然后令i=0,j=n-1,看arr[i]+arr[j]是否等于sum,如果是则结束,如果小于sum,则i=i+1;如果大于sum,则j=j-1。这样只需要在排好序的数组上遍历一次,就可以得到最后的结果,该步操作的时间复杂度为O(N)。两步加起来的时间复杂度为O(N*logN)。
查找伪码:
for( i=0,j=n-1; i<j; )
if(arr[i] + arr[j] == sum)
return (i , j);
else if( arr[i] + arr[j] < sum)
i++;
else
j--;
return (-1,-1);
解法1:穷举法,时间复杂度O(N);
解法2:变通思路,对数组中的每个数字arr[i]都判别sum-arr[i]在不在数组中。这样就变通为一个查找算法。将数组排序,需要时间O(N*logN)。对于每个arr[i]用二分法查找sum-arr[i]的时间复杂度都为O(logN),总计N*O(logN)+ O(N*logN)= O(N*logN)。
当然也可以用hash的方法简化查找,但是空间效率加大了。
解法3:首先对数组进行排序,时间复杂度为O(N*logN)。
然后令i=0,j=n-1,看arr[i]+arr[j]是否等于sum,如果是则结束,如果小于sum,则i=i+1;如果大于sum,则j=j-1。这样只需要在排好序的数组上遍历一次,就可以得到最后的结果,该步操作的时间复杂度为O(N)。两步加起来的时间复杂度为O(N*logN)。
查找伪码:
for( i=0,j=n-1; i<j; )
if(arr[i] + arr[j] == sum)
return (i , j);
else if( arr[i] + arr[j] < sum)
i++;
else
j--;
return (-1,-1);
相关文章推荐
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 程序员面试题:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 快速找出一个数组中的两个数,让这两个数字之和定于一个给定的值(编程之美2.12)
- 快速找出一个数组中的两个数字,使两个数之和 等于一个已给定的值
- (笔试中的题目)一个已经排序好的数组找到两个数字相加等于一个给定的数
- 给定一个数组和一个数字,给定的数组里是否存在两个数字之和等于给定的数字
- leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
- 经典算法学习——快速找出数组中两个数字,相加等于某特定值
- 算法题:从数组找数字(网易2017校园招聘) 2017-10-10 算法爱好者 (点击上方公众号,可快速关注) 给定一个数组,除了一个数出现 1 次之外,其余数都出现 3 次。找出出现一次的数。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字
- 给定一个数组,找出不在数组中的最小的那个数字
- 假设数组中有一个数字出现的次数超过了数组长度的一半,试编程找出这个数字(消除 qosrt 快速排序 哈希)
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- 给定一个整数数组,找出两个下标,要求后面下标所指的数减去前面下标所指的数之差最大
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字