力扣-14天算法入门
第1天 二分查找
第2天 双指针
第3天 双指针
第4天 双指针
第5天 双指针
第6天 滑动窗口
第7天 广度优先搜索 / 深度优先搜索
第8天 广度优先搜索 / 深度优先搜索
第9天 广度优先搜索 / 深度优先搜索
第10天 递归 / 回溯
第11天 递归 / 回溯
第12天 动态规划
第13天 位运算
第14天 位运算
力扣-第3天 双指针
前言
本系列文章是我的力扣刷题记录,采用c++进行编写
一、二分查找-查找一个数
难度(简单)
题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
分析:遍历数组,如果数组中元素不为0,就将左右指针进行互换,为什么呢?
我们以数组[0,1,0,3,12]为例:
刚开始左右指针都指向第1位,即都为0,
我们遍历第一次,记为i=0,得到nums[0]=0,不满足条件直接另右指针右移,现在left=0,right=1
我们遍历第二次,记为i=1,得到nums[1]=1,满足条件我们将nums[0]和nums[1]互换得到数组为:[1 0 0 3 12],这样就将原来不为0的数挤到最左边,同时我们使左指针往右移1位,右指针也往右移1位。得到left=1,right=2
我们遍历第三次,记为i=2,得到nums[2]=0,不满足条件直接另右指针右移,现在left=1,right=3
我们遍历第四次,记为i=3,得到nums[3]=3,满足条件我们将nums[1]和nums[3]互换得到数组为:[1 3 0 0 12],这样就将原来不为0的数挤到最左边,同时我们使左指针往右移1位,右指针也往右移1位。得到left=2,right=4
...
具体代码如下:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int left = 0;//左指针
int right = 0;//右指针
int len = nums.size();//数组长度
for (int i=0;i<len;i++)//遍历数组
{
if (nums[i])//0 1 0 3 12
{
int temp = nums[left];
nums[left]=nums[right];
nums[right]=temp;
left++;
}
right++;
}
}
};
二、两数之和 II - 输入有序数组
难度(简单)
题目:给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
示例 3
输入:numbers = [-1,0], target = -1
输出:[1,2]
代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0;
int right =numbers.size()-1;
while(left<=right)
{
if (numbers[left]+numbers[right]==target)
{
return {
left+1,right+1};
}
else if(numbers[left]+numbers[right]<target)
{
left++;
}
else if(numbers[left]+numbers[right]>target)
{
right--;
}
}
return {
-1,-1};
}
};
总结
期待大家和我交流,留言或者私信,一起学习,一起进步!