失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > LeetCode20天刷题计划之Day3

LeetCode20天刷题计划之Day3

时间:2024-01-03 06:57:52

相关推荐

LeetCode20天刷题计划之Day3

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]的形式返回这两个整数的下标index1index2

你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例 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] <= 1000numbers非递减顺序排列-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》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。