首页 > 其他分享 >leetcode(hot100)6、7

leetcode(hot100)6、7

时间:2025-01-05 14:32:23浏览次数:8  
标签:leftmax right rightmax nums height hot100 leetcode left

解题思路:先排序再利用双指针思想然后再去重处理。去重要 nums [i] == nums [i- 1 ] 考虑-1,-1,2这种情况。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>>result;
        for(int i = 0;i<nums.size();i++){
            if(nums[i] > 0)return result;
            if(i>0 && nums[i] == nums[i-1])continue;
            int left = i+1,right = nums.size()-1;
            while(left < right){
                if(nums[i]+ nums[left]+nums[right]>0)right--;
                else if(nums[i]+ nums[left]+nums[right]<0)left++;
                else{
                    result.push_back(vector<int>{nums[i],nums[left],nums[right]});
                    right--;
                    left++;
                    while(left < right && nums[right] == nums[right+1])right--;
                    while(left<right && nums[left] == nums[left-1])left++;
                }

            }

        }
        return result;
    }
};

解题思路:

当前能接住的雨水=min(左侧最高,右侧最高)−当前高度 可以理解为能储水的体积 是哪一侧的最高高度然后减去当前高度

利用双指针不断向中间移动,然后通过动态更新leftmax和rightmax,当左指针最大高度小于右指针最大高度就左移反之就右移。能够存储的雨水量是一侧得到的最大高度减去当前的高度。能存储雨水的一定是短板而不是长板所以长板可以忽略不计。

利用哪一侧高度低哪一侧指针去移动。为什么只比较 leftmax 和 rightmax:

  • 如果 leftmax < rightmax,说明左侧的高度限制了雨水量,右侧高度足够高,可以忽略右侧的影响。

  • 反之,右侧高度限制了雨水量,忽略左侧的影响。

移动较小的一边是因为:

  1. 当前柱子的储水量取决于较小的一边。

  2. 较大的一边还有可能影响后续柱子的储水量,所以暂时不移动。

    class Solution {
    public:
        int trap(vector<int>& height) {
            int left = 0,right = height.size()-1,sum = 0;
            int leftmax=0,rightmax=0;
            while(left < right){
                leftmax = max(leftmax,height[left]);
                rightmax = max(rightmax,height[right]);
                if(leftmax < rightmax){
                    sum += leftmax-height[left];
                    left++;
                }
                else{
                    sum += rightmax-height[right];
                    right--;
                }
            }
            return sum;
            
        }
    };

标签:leftmax,right,rightmax,nums,height,hot100,leetcode,left
From: https://blog.csdn.net/2301_79604637/article/details/144945024

相关文章

  • leetcode(hot100)5
    解题思路:(感觉用到了贪心)双指针思想,首先计算当前面积,然后更新最大容量。移动指针的条件就是当左边高度小于右边了就左指针向右移反之右指针向左移。(因为我们想尝试找到更高的线段以可能增加容量。)移动指针:比较两指针所指的高度:如果左侧高度height[i]小于右侧高度hei......
  • leetcode(hot100)4
    解题思路:双指针思想利用两个for循环,第一个for循环把所有非0的全部移到前面,第二个for循环将指针放在非0的末尾全部加上0。还有一种解法就是利用while循环双指针条件,当不为0就两个指针一起移动,为0就只移动右指针。不为0时交换左右数值,为0就不交换了。(如果数组没有0,那么快慢......
  • LeetCode 45. 跳跃游戏 II
    简介在算法领域,"跳跃游戏"是一个著名的问题,它模拟了在数组中通过跳跃到达特定位置的过程。"跳跃游戏II"是这个问题的一个变种,它要求我们找到到达数组末尾的最小跳跃次数。在这篇文章中,我们将详细解析这个问题,并提供一个高效的解决方案。问题描述算法解析我们采用贪心算法......
  • LeetCode 300. 最长递增子序列
    问题描述在算法领域,最长递增子序列(LongestIncreasingSubsequence,简称LIS)是一个经典问题。给定一个整数数组nums,我们的任务是找到其中最长严格递增子序列的长度。这里的“子序列”指的是在不改变其余元素顺序的情况下,通过删除(或不删除)数组中的元素得到的新序列。问题难点......
  • LeetCode算法题 (二叉树的直径)Day11!!!C/C++
    https://leetcode.cn/problems/diameter-of-binary-tree/description/一、题目描述给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它......
  • leetCode 739.每日温度
    题目给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。示例1:输入:temperatures=[73,74,75,71,69,72,76,73]输出:[1,1,4,2,1,1,0,0]示......
  • LeetCode232.用栈实现队列
    题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的元素booleanempty()如果队......
  • leetCode 283.移动零
    题目给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出:[0]思路:双指针。如果数组没有0,......
  • LeetCode22.括号生成
    题目:数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]思路:回溯法。如果左括号数量小于生成括号的对数,可以放一个左括号如果......
  • leetCode155:最小栈
    题目:设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)将元素val推入堆栈。voidpop()删除堆栈顶部的元素。inttop()获取堆栈顶部的元素。intgetMin()获取堆......