怎样做展会推广网站,wordpress 编辑器模板,strikingly建站怎么样,平面设计主要做什么工资多少作者#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 题库#xff1a;力扣 题目序号#xff1a;167#xff08;简单#xff09; 题目#xff1a; 给你一个下标从1开始的整数数组 numbers #xff0c;该数组已按非… 作者前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 题库力扣 题目序号167简单 题目 给你一个下标从1开始的整数数组 numbers 该数组已按非递减顺序排列请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] 则 1 index1 index2 numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入只对应唯一的答案 而且你不可以重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
示例 1
输入numbers [2,7,11,15], target 9 输出[1,2] 解释2 与 7 之和等于目标数 9 。因此 index1 1, index2 2 。返回 [1, 2] 。
解题思路 这里需要注意的几个条件是 ①下标从1开始得到的结果要加1 ②非递减顺序排列递增 ③不可以重复使用相同元素下标不能一样 ④必须只使用常量级的额外空间传入的是大小为n的数组如果我们使用了大小为n或与n成正比的数组去存储计算的中间结果那么就没有使用常量级
由于这是一个递增的数组那么基础的解题思路是可以采用暴力枚举的思路(点击跳转暴力枚举解法) 另外还可以采用双向指针的思路也就是从数组的第一项和最后一项去双向奔赴那么需要注意的是由于数组是非递减顺序排列的所以如果得到的结果小于tagget那么应该是左边的下标1反之则是右边下标-1这也很好理解例如示例1的数组[2,7,11,15]第一次是21517大于目标数9那么右边的数就应该从15退到11也就是right--
解题代码
function twoSum(numbers: number[], target: number): [number, number] | null { let left 0;// 注意由于数组从0开始所以最后一项是length-1let right numbers.length - 1; while (left right) { const sum numbers[left] numbers[right]; // 判断结果如果相等直接returnif (sum target) { return [left 1, right 1];// 当和小于目标数时 } else if (sum target) { left;// 当和大于目标数时} else { right--; } } return null;
} 解题过程示例 示例1的数组[2,7,11,15]第一次是21517大于目标数9那么右边的数就应该从15退到11也就是right--直至279此时得到下标数组[0,1]然后下标都加1满足题意