LeetCode(CPP):一月刷完热题100(3)

本文详细解析了LeetCode中5道经典题目,包括11. 盛水最多的容器、15. 三数之和、17. 电话号码的字母组合、19. 删除链表的倒数第N个结点和20. 有效的括号。通过C++实现,讲解了各自的主要思路和解题技巧,涉及双指针、回溯算法和栈的应用。
摘要由CSDN通过智能技术生成

11. 盛水最多的容器(mid)

思路:

在左右两侧分别维护一个指针,每次计算两个指针之间可以容纳水的容积,这个计算满足”木桶效应“,即以短边为准。

指针移动的依据是,哪边短就移动哪边。

维护一个ans来记录此过程中的容积最大值。

//双指针
class Solution{
public:
    int maxArea(vector<int>& height){
        int l=0,r=height.size()-1;//分别从左右开始的两个指针
        int ans=0;
        while(l<r){
            int area=min(height[l],height[r])*(r-l);//当前左右指针位置容积
            ans=max(ans,area);//每次循环都取大的容积
            //谁小谁变
            if(height[l]<=height[r])
            {
                ++l;
            }
            else{--r;}
        }
        return ans;
    }
};

 

15. 三数之和(mid)

 思路:

a+b+c=0,首先想到三层循环(wssb),变换一下思路b+c=-a=target,就减掉了一层循环!

但是这个target的值也是随a实时变化的,不能定义为全局变量,并且为了target有规律,先对数组进行sort,这样左侧的负数+右侧的正数结果才为0,特殊情况是abc全为0。

默认a<b<c,意味着abc在数组中具有顺序关系。

首先枚举a (也就是-target),遇见重复的数字可跳过,以保证不出现重复三元组;具体细节在注释中标识。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        vector<vector
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值