两数之和 II - 输入有序数组
給定一個已按照 升序排列 的整數數組 numbers ,請你從數組中找出兩個數滿足相加之和等于目標數 target 。
函數應該以長度為 2 的整數數組的形式返回這兩個數的下標值。numbers 的下標 從 1 開始計數 ,所以答案數組應當滿足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假設每個輸入只對應唯一的答案,而且你不可以重復使用相同的元素。
示例 1:
輸入:numbers = [2,7,11,15], target = 9
輸出:[1,2]
解釋:2 與 7 之和等于目標數 9 。因此 index1 = 1, index2 = 2
示例 2:
輸入:numbers = [2,3,4], target = 6
輸出:[1,3]
示例 3:
輸入:numbers = [-1,0], target = -1
輸出:[1,2]
提示: 2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000 numbers 按 遞增順序 排列
-1000 <= target <= 1000 僅存在一個有效答案
這道題很簡單,我開始想到用兩重循環實現,代碼如下:
/*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {int i,j,flag=0;int *index=(int *)malloc(sizeof(int)*2);for(i=0;i<numbersSize-1;i++){for(j=i+1;j<numbersSize;j++){if(numbers[i]+numbers[j]==target){index[0]=i+1;index[1]=j+1;*returnSize=2;flag=1;break;}}if(flag==1)break;}return index; }但是我沒有想到用雙指針如何寫,看了官方題解后再分析一下思路:
定義一個low指針指向數組頭,定義一個high指針指向數組尾,首位相加,若相等則存入返回數組,若和小于targe則low右移一位,若和大于targe則high左移一位。一直到找出為止。
為什么小于targe左移,而大于targe右移呢?
很好理解,當low和high分別位于數組首尾時,high是最大值,low是最小值;若他倆和小于targe,則需要增大和,那么low只能右移增大;
同理若他倆和大于targe,則需要減小和,那么high只能左移減小;
代碼如下:
/*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {int low=0,high=numbersSize-1;int *index=(int*)malloc(sizeof(int)*2);*returnSize=2;while(low<high){if(numbers[low]+numbers[high]==target){index[0]=low+1;index[1]=high+1;break;}else if(numbers[low]+numbers[high]<target)low++;elsehigh--;}return index; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的两数之和 II - 输入有序数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动零移除元素
- 下一篇: 删除有序数组中的重复项(数组去重)