首页 > 其他分享 >LeetCodeHot100 283. 移动零 11. 盛最多水的容器 15. 三数之和 42. 接雨水

LeetCodeHot100 283. 移动零 11. 盛最多水的容器 15. 三数之和 42. 接雨水

时间:2024-03-10 23:11:56浏览次数:28  
标签:11 15 nums int LeetCodeHot100 height ++ while 指针

283. 移动零
https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked

public void moveZeroes(int[] nums) {
        int r = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0){
                int temp = nums[r];
                nums[r] = nums[i];
                nums[i] = temp;
                r++;
            }
        }
    }

总结:一个指针去记录放非0的位置,一个指针去遍历
11. 盛最多水的容器
https://leetcode.cn/problems/container-with-most-water/description/?envType=study-plan-v2&envId=top-100-liked

public int maxArea(int[] height) {
        int i = 0 , j = height.length - 1;
        int maxRain = 0;
        while (i < j){
            maxRain = height[i] < height[j] ? 
                    Math.max(maxRain , getRain(height ,i++,j)) :
                    Math.max(maxRain , getRain(height,i,j--));
        }
        return maxRain;
    }
    public int getRain(int[] height, int i,int j){
        return (j - i) * Math.min(height[i],height[j]);
    }

总结:使用双指针,总体思想就是先让指针在左右边界,然后每次指针往里收缩,收缩哪个呢,收缩二者矮的那个,因为收缩矮的,下个面积可能变大,如果收缩高的,下个面积不变(收缩了之后高度一样)或变小(收缩之后高度变小)(ps:如果收缩之后高度变大了,由于有之前的短板的存在,所以木桶效应,还是面积会变小)
15. 三数之和
https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-100-liked

public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        List<List<Integer>> resList = new ArrayList<>();
        for (int k = 0; k < nums.length - 2; k++) {
            if (nums[k] > 0) break;
            if (k > 0 && nums[k] == nums[k-1]) continue;
            int i = k + 1 , j = nums.length - 1;
            while (i < j){
                int sum = nums[k] + nums[i] + nums[j];
                if (sum > 0){
                    do{
                        j--;
                    }while (i < j && nums[j] == nums[j+1]);
                }else if (sum < 0){
                    do {
                        i++;
                    }while (i < j && nums[i] == nums[i-1]);
                }else {
                    resList.add(new ArrayList<Integer>(Arrays.asList(nums[k],nums[i],nums[j])));
                    do{
                        j--;
                    }while (i < j && nums[j] == nums[j+1]);
                    do {
                        i++;
                    }while (i < j && nums[i] == nums[i-1]);
                }
            }
        }
        return resList;
    }

总结:关键点在于去重,这里使用的方法就是先排序了,排序之后通过指针可以很好解决去重(发现和上一个重复就再往中间移动), 最后犹豫不决先排序,步步逼近双指针!
42. 接雨水
https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-100-liked

public int trap(int[] height) {
        int rain = 0;
        // 左右指针:分别指向左右两边界的列
        int left = 0;
        int right = height.length - 1;
        // 左指针的左边最大高度、右指针的右边最大高度
        int leftMax = height[left];
        int rightMax = height[right];
        // 最两边的列存不了水
        left++;
        right--;
        // 向中间靠拢
        while (left <= right){
            leftMax = Math.max(leftMax,height[left]);
            rightMax = Math.max(rightMax,height[right]);
            if (leftMax <= rightMax){
                // 左指针的leftMax比右指针的rightMax矮
                // 说明:左指针的右边至少有一个板子 > 左指针左边所有板子
                // 根据水桶效应,保证了左指针当前列的水量决定权在左边
                // 那么可以计算左指针当前列的水量:左边最大高度-当前列高度
                rain += leftMax - height[left];
                left++;
            }else {
                // 右边同理
                rain += rightMax - height[right];
                right--;
            }
        }
        return rain;
    }

总结:核心思想就是上面注释中说的那样,左最高和右最高,若从左往右遍历的话 会更新左最高,此时如果右最高比左最高大就说明这一列肯定有水,就加进去即可 这道题我会每天复习一遍

标签:11,15,nums,int,LeetCodeHot100,height,++,while,指针
From: https://www.cnblogs.com/jeasonGo/p/18065070

相关文章

  • vs2019单独重新安装python37_64失败解决办法(bilibili上我最早写的是https://www.bilib
    上个周末的时候,我发现用vs2019编写python的时候。代码高亮出现了奇怪的问题,进入解决方案的时候,print还是蓝色的,但是过了几秒钟后就变为黑色了,因此在最开始的时候我试图通过换一个皮肤和在管理扩展里面找扩展来解决,但是还是有相关问题。于是到vs2019对应的python文件夹找问题,目录是......
  • 11
    real_img=real_input_img.squeeze(0).permute(2,1,0).cpu().numpy()syn_img=label_img.squeeze(0).permute(2,1,0).cpu().numpy()mean_gray_real=cv2.cvtColor(real_img.astype(np.float32),cv2.COLOR_BGR2GRAY).mean()mean_gray_syn_high=cv2.cvtColor(syn_img.......
  • 升级Win11专业版只需一秒无需工具,Win11专业版升级密钥
    Windows11专业版是面向技术爱好者、企业和技术人员的操作系统版本,它在Windows11家庭版的基础上增加了许多功能,可帮助您提高工作效率和安全性。主要功能:设备和应用管理:可使用组策略、MicrosoftIntune和WindowsAutopilot等工具管理设备和应用。数据保护:使用Bit......
  • 升级Win11专业工作站版密钥,无需代码一秒升级
    Windows11专业工作站版是Windows11的高级版本,专为满足对性能、可靠性和安全性有最高要求的专业工作站而设计。它具有Windows11专业版的所有功能,以及一些其他功能,例如:对四路CPU和6TB内存的支持支持ReFS文件系统支持远程直接内存访问(RDMA)支持非易失性内存......
  • 11
    《程序是怎样跑起来的》第十一章这一章提到了计算机系统的硬件架构,CPU的运作需要依赖一系列的硬件控制方法,例如编程接口、驱动程序、中断、DMA等。这些方法的存在使得CPU能够与各种硬件设备进行有效的通信和交互。在学习过程中,我发现了中断和DMA这两种硬件控制方法。中断允许CP......
  • 学java15结构
    1.顺序结构java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。顺序结构是最简单的算法结构。语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。2.选择结构if单选择结......
  • Gym-101915D 题解
    D给定一张图,分为左右各\(P\)个点,左右各自内部是一个完全图,左右之间有\(m\)条边。求这个图的最大团。\(P\le20,m\leP^2\)。对于每个右部点,求出一个长度为\(20\)的二进制数,第\(i\)位是\(1\)表示它与左部第\(i\)点有连边。枚举右部点的子集\(S\),将它们的二进制数......
  • 苹果m3 macbook pro安装windows 11 arm版虚拟机后可以运行农行网银
    朋友新买一台m3macbookpro,CPU是arm版的,我给安装了parallel+win11arm,windows运行正常,office,foxmail,微信运行没问题问题。这台arm版的机器跑win11arm速度流畅,办公完全没有问题。安装了农行企业网银后,发现不能正常登录,反复研究后无果。 最后解决办法:朋友带着机器去了......
  • 11_Linux目录结构讲解
    Linux目录结构讲解1.Linux目录结构Linux整个文件系统是从/目录开始2.Linux文件层次标准为了解决不同的开发人员之间不统一的问题,文件层次标准简称FHS,全称filesystemhierarchstandardFHS定义了俩层规范:/目录下面应该要放什么文件,比如/etc下面就应该放配置文件。第二层......
  • abc156D 带朵数限制的不同扎花方案数
    cfy有n种花,每种各1朵,需要从中选出1种或多种来扎成花束,要求花的朵数不能是a或b,问可以制作多少种不同的花束?结果对1E9+7取模。2<=n<=1E9;1<=a<b<=min(n,2E5)每朵花都有选与不选两种情况,去掉都不选的情况,共2^n-1种方案。然后再减掉选a种和选b种的情况,方案数分别为C(n,a)和C(n,b),这......