Cool说丨力扣167

简介: 167. 两数之和 II - 输入有序数组


167. 两数之和 II - 输入有序数组]

https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

说明:

返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:

输入: numbers= [2, 7, 11, 15], target=9

输出: [1,2]

解释: 27之和等于目标数9。因此index1=1, index2=2

第一次

   vector<int>twoSum(vector<int>&numbers, inttarget) {

   vector<int>vIndex;

   vIndex.reserve(2);

   if (numbers[0] +numbers[1] ==target)

   {

       vIndex.push_back(1);

       vIndex.push_back(2);

       returnvIndex;

   }

   intmax=0,min=0;

   for (inti=numbers.size()-1;i>=0;--i)

   {

       if (numbers[i] >target&&numbers[i-1] <=target)

       {

           max=i-1;

           break;

       }

   }

   while (max>min)

   {      

       intmid= (max+min) /2;

       if (numbers[max] +numbers[min] ==target)

       {

           vIndex.push_back(min+1);

           vIndex.push_back(max+1);

           returnvIndex;

       } elseif (numbers[mid]*2>target){

           max=mid;

       }

       elseif (numbers[mid]*2<target) {

           min=mid;

       }

   }

   returnvIndex;

   }

输入为[2,3,4] 6

这种情况就是尾数比target还要大,所以有缺陷

还有就是 有序数组的第一个元素可能为 负数 ,比如[-3,1,2,3,4],target为 0 ,这样的话,第一步会直接定位到 1 这个元素,所以,找max的那里有缺陷

   for (inti=numbers.size()-1;i>=0;--i)

   {

       if (numbers[0]+numbers[i] <=target) { max=i; break; }

       elseif (numbers[0] +numbers[i] >target&&numbers[0] +numbers[i-1] <=target)

       {

           max=i-1;

           break;

       }

   }

加上首元素,numbers[0]+ numbers[i]来判断就可以防止这种情况了。还有就是要判断尾元素是不是就比target小的情况。

第三次:

vector<int>vIndex;

   vIndex.reserve(2);

   if (numbers[0] +numbers[1] ==target)

   {

       vIndex.push_back(1);

       vIndex.push_back(2);

       returnvIndex;

   }

   intmax=0,min=0;

   for (inti=numbers.size()-1;i>=0;--i)

   {

       if (numbers[0]+numbers[i] <=target) { max=i; break; }

       elseif (numbers[0] +numbers[i] >target&&numbers[0] +numbers[i-1] <=target)

       {

           max=i-1;

           break;

       }

   }

   //cout << "max " << max << endl;

   while (max>min)

   {

       

       intmid= (max+min) /2;

       //cout << "max " << max << " min" << min << " mid "<

       if (numbers[max] +numbers[min] ==target)

       {

           //cout << "numbers[max] + numbers[min] == target" << endl;

           vIndex.push_back(min+1);

           vIndex.push_back(max+1);

           returnvIndex;

       } elseif (numbers[mid]*2>target){

           max=mid;

       }

       elseif (numbers[mid]*2<=target)    {

           min=mid;

       }

   }

   returnvIndex;

输入为 [1,2,3,4,4,9,56,90]  8

这种最中间的两个元素是最终结果,所以要在 numbers[mid] *2

第四次:就告诉我超出时间限制了。。

直接双指针,简单粗暴!!

vector<int>twoSum(vector<int>&numbers, inttarget) {

   

   intlow=0, high=numbers.size() -1;

   while (low<high) {

       intsum=numbers[low] +numbers[high];

       if (sum==target)

           returnvector<int>{ low+1, high+1 };

       elseif (sum<target)

           ++low;

       else

           --high;

   }

   return { -1, -1 };

}


目录
相关文章
|
人工智能 C# C++
Cool说丨力扣153、454
153. 寻找旋转排序数组中的最小值 454. 四数相加 II
130 1
|
C# C++
Cool说丨力扣287/792/378
关注博主,获取更多知识
103 0
|
C# C++ 索引
Cool说丨力扣162
162. 寻找峰值
95 0
|
存储 C# C++
Cool说丨力扣29/34
关注博主。获取更多知识
103 0
|
存储 C# C++
Cool说丨力扣392
392. 判断子序列
74 0
|
C# C++
Cool说丨力扣744、704
744. 寻找比目标字母大的最小字母 704. 二分查找
106 0
|
C#
Cool说丨力扣475
475. 供暖器
113 0
|
机器学习/深度学习 算法 C#
Cool说丨力扣202
202. 快乐数
100 0
|
C# C++
Cool说丨力扣374、441
441. 排列硬币 374. 猜数字大小
89 0
|
C# C++
Cool说丨力扣367
367. 有效的完全平方数
209 0