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& 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] <= 1000numbers按 非递减顺序 排列-1000 <= target <= 1000- 仅存在一个有效答案
注:一开始想的很简单,直接两层循环找到相等的就返回,测试用例通过,但是超出了时间限制。然后尝试用二分法来解决,首先定义头尾两个指针,如果头尾元素相加大于目标值,就把末尾元素索引前移,如果小于目标值,就把头元素后移,如果相等就返回。这样就不需要进行两次循环导致超出时间限制
//两层遍历,超出时间限制。
class Solution {
public:vector twoSum(vector& numbers, int target) {int n = numbers.size();vector 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 twoSum(vector& numbers, int target) {int n = numbers.size();vectora;int left=0, right=n-1;while(lefttarget){right--;}else if(numbers[left]+numbers[right]
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
