力扣-第3天 双指针

力扣-14天算法入门

第1天 二分查找
第2天 双指针
第3天 双指针
第4天 双指针
第5天 双指针
第6天 滑动窗口
第7天 广度优先搜索 / 深度优先搜索
第8天 广度优先搜索 / 深度优先搜索
第9天 广度优先搜索 / 深度优先搜索
第10天 递归 / 回溯
第11天 递归 / 回溯
第12天 动态规划
第13天 位运算
第14天 位运算



前言

本系列文章是我的力扣刷题记录,采用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};
    }
};

总结

期待大家和我交流,留言或者私信,一起学习,一起进步!

おすすめ

転載: blog.csdn.net/CltCj/article/details/120317416