算法基础学习Day4(双指针)

文章目录

1.题目

  1. LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)
  2. 15. 三数之和 - 力扣(LeetCode)

2.题目解答

1.查找总价格为目标值的两个商品

1.1题目及题目解析

1.2算法学习

暴力解法

这里我们还是先进行暴力解法,根据暴力解法去寻找更好的算法:

直接进行枚举比对即可:

cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) {
        vector<int> end;
        for(int i =0 ;i<=price.size()-2;i++)
        {
            for(int j =i+1;j<=price.size()-1;j++)
            {
                if(price[i]+price[j]==target)
                {
                    end.push_back(price[i]);
                    end.push_back(price[j]);
                }
            }
        }
        end.resize(2);
        return end;
    }
};

当然这里是过不了的

优化算法

这里因为数组是有序的我们仍然要用指针的方法

先让left指针指向最左边,让right指针指向最右边

直接让leftright指向的数进行相加和target进行比较

会出现以下两种情况:

  1. leftright指向的数比target

    因为数组有序,当left不行时,去找比left大的数,直接让left++

  1. leftright指向的数比target

    此时就不能去移动left了,应该让right向左移动了所以应该是right--

  1. 将这两部分写成代码如下:

    cpp 复制代码
    while(left<right)
    {
        if(price[left]+price[right]>target)
        {
            right--;
        }
        else if(price[left]+price[right]<target)
        {
            left++;
        }
        else
        {
            end.push_back(price[left]);
            end.push_back(price[right]);
            break;
        }
    }

1.3代码提交

全部代码如下:

cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) {
        vector<int> end;
        int left=0,right = price.size()-1;
        while(left<right)
        {
            if(price[left]+price[right]>target)
            {
                right--;
            }
            else if(price[left]+price[right]<target)
            {
                left++;
            }
            else
            {
                end.push_back(price[left]);
                end.push_back(price[right]);
                break;
            }
        }
        return end;
    }
};

2.三数之和

2.1题目及题目解析

2.2算法学习

这里有两种解法:

  1. 解法一:排序+暴力枚举+利用set去重
  2. 解法二:排序+双指针

这里我们主要演示第二章解法,并且不用set去重:

首先先选择一个固定数,此时就会发现一个数学关系:

当剩下的两个数为固定数的相反数时,就会成立

所以后面就变成了和前一题一样的解法:找两个数的和

如图:

但是这里仍然有个问题:

如何去重?

这里有两种解决方法:

  1. 直接用容器去解决(这里我们就不在使用了)
  2. 找到第一个结果,可以让left和right跳过重复元素,同时固定的数字也要跳过重复元素,但是这里在用循环+/-时一定要注意不要越界访问

2.3代码提交

cpp 复制代码
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> vv;
        vector<int> v;
        sort(nums.begin(), nums.end());
        int i = 0;
        while (i < nums.size()) {
            if(nums[i]>0)
            {
                break;
            }
            int left = i + 1;
            int right = nums.size() - 1;
            while (left < right) 
            {
                if (nums[left] + nums[right] > (-nums[i])) 
                {
                    right--;
                } 
                else if (nums[left] + nums[right] < (-nums[i])) 
                {
                    left++;
                } 
                else 
                {
                    v.push_back(nums[i]);
                    v.push_back(nums[left]);
                    v.push_back(nums[right]);
                    vv.push_back(v);
                    v.clear();
                   left++,right--;//这里先进行++/--
                    while (left<right && nums[left] == nums[left - 1]) //这里比较就要-1
                    {
                        left++;
                    }
                    while (right>left && nums[right] == nums[right + 1]) 
                    {
                        right--;
                    }
                }
            }
            i++;
            while ( i < nums.size()&&nums[i] == nums[i - 1]) {
                i++;
            }
        }
        return vv;
    }
};
相关推荐
AL流云。6 分钟前
学习Docker前提:多环境安装Docker
学习·docker·eureka·1024程序员节
2301_8035545243 分钟前
Http学习
网络协议·学习·http
风已经起了1 小时前
FPGA学习笔记——用Vitis IDE生成工程(串口发送)
笔记·学习·fpga开发·fpga·1024程序员节
学工科的皮皮志^_^1 小时前
锂电池充放电管理学习
经验分享·笔记·单片机·嵌入式硬件·学习·1024程序员节
"菠萝"1 小时前
C#知识学习-018(方法参数传递)
学习·c#·1024程序员节
Theodore_10221 小时前
深度学习(3)神经网络
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉
地平线开发者2 小时前
大模型 | VLA 初识及在自动驾驶场景中的应用
算法·自动驾驶
py有趣2 小时前
LeetCode学习之实现strStr()
学习·算法·leetcode
夏鹏今天学习了吗2 小时前
【LeetCode热题100(52/100)】课程表
算法·leetcode·职场和发展
祁思妙想2 小时前
【LeetCode100】--- 101.重排链表【思维导图+复习回顾】
算法·leetcode·链表