class Solution { public int[] twoSum(int[] numbers, int target)
{ int left=0;int right=numbers.length-1;
while(left<right)
{ if(numbers[left]+numbers[right]==target)break;
if(numbers[left]+numbers[right]<target)left++;
else right--; } return int[]{left+1,right+1}; }}
上面这种方法首先设了两个索引值 一个设为numbers数组的首索引,一个设在结尾的length-1然后如果两个索引值加起来 不等于target的话 就查看其值如果小于target 则左边 (因为该数组为已排序的数组 ,所以最前面的值必然是最小的)的索引后移如果大于target 则右边(最后面必然是最大的)的索引前移该方法最理想的时间复杂度是o(1) 平均复杂度大约是o(n)最坏的情况是需要右移或者左移遍历整个数组才能找到答案刚开始做的时候 我的思路是while这步 直接while(numbers[left]+numbers[right]==target)刚开始自己觉得没问题 后来才发现 如果这样做判断 假设第一步不等于 那么将无法做接下来的迭代,例如寻找更小索引的数另外有一种想法是用二分查找做 但是这种方法的时间复杂度是o(n*logn)故此没有优于上面的算法 没有实现