283. 移动零
给定一个数组nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意,必须在不复制数组的情况下原地对数组进行操作。
示例 :
输入:nums = [0,1,0,3,12]
输出:[1,3,12,0,0]
输入:nums = [0]
输出:[0]
提示:1 <= nums.length <= 104;
-231 <= nums[i] <= 231 - 1
注:本题使用双指针的方法来遍历,把不等于0 的元素统一计下,让后剩下的赋值为0,最后输出数组。先用i指针遍历不为0 的元素,然后用k指针记录元素新的位置。
class Solution {public:void moveZeroes(vector<int>& nums) {int n = nums.size();int k = 0;for(int i = 0;i < n;i++){if(nums[i]!=0){nums[k++] = nums[i];}}for(int i = k;i < n;i++){nums[i] = 0;} }};
167. 两数之和 II - 输入有序数组
给你一个下标从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] 。
示例 2:
输入:numbers = [2,3,4], target = 6输出:[1,3]解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
示例 3:
输入:numbers = [-1,0], target = -1输出:[1,2]解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
提示:
2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers
按非递减顺序排列-1000 <= target <= 1000
仅存在一个有效答案
注:一开始想的很简单,直接两层循环找到相等的就返回,测试用例通过,但是超出了时间限制。然后尝试用二分法来解决,首先定义头尾两个指针,如果头尾元素相加大于目标值,就把末尾元素索引前移,如果小于目标值,就把头元素后移,如果相等就返回。这样就不需要进行两次循环导致超出时间限制
//两层遍历,超出时间限制。class Solution {public:vector<int> twoSum(vector<int>& numbers, int target) {int n = numbers.size();vector<int> a;for(int i = 0;i < n;i++){for(int j = i + 1;j < n;j++){if(numbers[i] + numbers[j] == target){a.push_back(i+1);a.push_back(j+1);return a;}}}return a;}};
//双指针,减少搜索空间class Solution {public:vector<int> twoSum(vector<int>& numbers, int target) {int n = numbers.size();vector<int>a;int left=0, right=n-1;while(left<right){if(numbers[left]+numbers[right]>target){right--;}else if(numbers[left]+numbers[right]<target){left++;}else{a.push_back(left+1);a.push_back(right+1);return a;}}return a;}};
如果觉得《LeetCode20天刷题计划之Day3》对你有帮助,请点赞、收藏,并留下你的观点哦!