写在前面:本文题单均来自力扣的算法刷题计划,开这个系列主要是以题目与题解的形式对一些常见、常用算法进行归类和总结,希望在促进自己学习的同时也能帮助到看到这篇文章的大家。另外,本文并非一天一更~(对没错又是我双指针)
目录
题目一:283. 移动零
题目描述:
题目分析:
这题我们只需要设置两个指针 i 和 cnt ,然后遍历整个数组,当遍历用的指针 i 遇到非 0 元素时,cnt 才会 +1 ,所以当 i 和 cnt 所指向的位置不一样时,说明前面出现了 0 这个元素,所以需要进行交换,便将 i 所指向的位置的元素赋给 cnt 所指向的位置的元素再让 i 所指向的位置的元素赋值为 0 即可。
题解代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int i=0,cnt=0;i<nums.size();i++)
{
if(nums[i]!=0)
{
if(i!=cnt)
{
nums[cnt]=nums[i];
nums[i]=0;
}
cnt++;
}
}
}
};
题目二:167. 两数之和 II - 输入有序数组
题目描述:
题目分析:
这题告诉我们数组已经按照从小到大的顺序排好了,所以我们只需要在数组的头和尾各设置一个指针,然后再判断头尾指针的和与目标数 target 的大小关系,若和比 target 大,说明尾指针大了,所以应该左移一位,从而减小和的大小,然后再次进行判断,若小了则说明头指针小了,应该右移一位,从而增大和的大小,直到和等于 target ,以此类推。
题解代码:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target)
{
for(int i=0,j=numbers.size()-1;i<j;)
{
int sum=numbers[i]+numbers[j];
if(sum==target)
return {i+1,j+1};
else if(sum>target)
j--;
else
i++;
}
return {};
}
};