概述
个人思路:
A+B = target
设numbers[0]为A,for循环numbers[1]及后面的数据,枚举是否符合A+B=target 的B值,若无,则设numbers[1]为A,for循环numbers[2]及后面的数据,枚举是否有符合A+B = target的B值,以此类推。
这样的方法显然是很暴力的,倘若题目所给的数组的数据很庞大,那么此解题思路根本不实用。
时间复杂度为O(n2)
优化解题思路
抓关键字 “升序排列的数组” ==>有可能会涉及到二分法/折半查找/双指针
先分成三种情况:
(1)倘若 numbers[i]+numbers[j] === target ,那么直接return i 和 j 即可,但由于题目说下标应从1开始,而非0开始,所以需返回 i+1 和 j+1
(2)倘若 numbers[i]+numbers[j] > target ,那么 numbers[i]+numbers[j+1] > target,此时在升序数组里, j 需向前移动一位
(3)倘若 numbers[i]+numbers[j] < target ,那么 numbers[i-1]+numbers[j] < target,此时在升序数组里, i 需向后移动一位
代码如下:
var twoSum = function(numbers, target) {
let left = 0,right = numbers.length-1;
while(left<=right){
if(numbers[left]+numbers[right] === target){
return [left+1,right+1]
}else if(numbers[left]+numbers[right] < target){
left++
}else{
right--
}
}
};
tip:此题目的双指针思想:根据不同情况,移动 left 和 right 的位置,以达到不断缩小查找范围的目的,自己在做题的时候,一直局限在mid值,其实涉及到二分法、双指针的时候,不一定要用到mid值,以后要灵活变通!
因为优化的解法中,数组只需遍历一次,那么它的时间复杂度度是为O(n),比上面的暴力枚举法O(n2)更实用!
总结
双指针本质
1.利用问题本身所给的序列特性(升序或者降序)
2.使用两个指针对数组进行扫描,可以正向也可以反向(达到缩小查找的范围)
最后
以上就是天真歌曲为你收集整理的【算法天天练】两数相加等于目标值+有序数组问题的全部内容,希望文章能够帮你解决【算法天天练】两数相加等于目标值+有序数组问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复