当前位置: 首页 > news >正文

leetcode麻烦又易忘记题目

双指针

同种思路的相向双指针方法

有序数组的平方 做到 O(n)
找到 K 个最接近的元素
数组中的 K 个最强值 用双指针解决
两数之和 II - 输入有序数组
平方数之和
统计和小于目标的下标对数目
采购方案 同 2824 题
三数之和https://leetcode.cn/problems/3sum/description/
最接近的三数之和
四数之和https://leetcode.cn/problems/4sum/description/
有效三角形的个数
数的平方等于两数乘积的方法数 用双指针实现
三数之和的多种可能 1711

1, 四数之和
排序 + 双指针方法。 实现On3时间复杂度
思路:
穷举第一个数
再穷举第二个数
剩下两个数就转为了使用相向双指针寻找恰好让四个数和为target的方法

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();
        int n = nums.length;

        for(int i = 0; i < n - 3; ++i){
            long outi = nums[i];
            if(i > 0 && outi == nums[i - 1]) continue;
            

            for(int j = i + 1; j < n - 2; ++j){
                long outj = nums[j];
                //这里用例中虽然溢出了,不担心int强转溢出问题是因为这个用例刚好没有符合条件的组合
                if(j > i + 1 &&outj== nums[j - 1]) continue;
                
                int left = j + 1;
                int right =  n - 1;
                while(left < right){
                    long sum = outi + outj + nums[left] + nums[right];
                    if(sum > target){
                        -- right;
                    }else if(sum < target){
                        ++ left;
                    }else{
                        ans.add(List.of((int)outi,(int)outj,nums[left],nums[right]));
                        for(left++; left < right && nums[left] == nums[left - 1]; ++ left);
                        for(right --; left < right && nums[right] == nums[right + 1]; -- right);
                    }
                }

            }
        }
        return ans;
    }
}

木桶原理

1,盛最多水的容器
https://leetcode.cn/problems/container-with-most-water/description/

class Solution {
    public int maxArea(int[] height) {
        //这个题就是移动短边
        //从题意上,假设以第一个数为左侧边,然后应该穷举右侧边直到最后一个数
        //然后再假设以第二个数为左侧边,穷举右侧边直到最后一个数。
        //依次类推,暴力。On2
        //但是双指针可以实现On的复杂度,同时借助left和right只移动短边
        //就代表它所匹配的另一侧的长边,当前的面积是最大值。
        //例如:1,8,6,2,5,4,8,3,7
        //第一次left的1最短,因为right-left已经是最大,1不管匹配对侧的长边
        //包括8,6,2,5,4,8,3这些都不用再遍历了,因为1和7对应的right-left最大
        //此时面积就是这些中最大的
        int left = 0;
        int right = height.length - 1;
        int ans = 0;
        while(left < right){
            int area = (right - left) * Math.min(height[left], height[right]);
            ans = Math.max(ans, area);
            if(height[left] < height[right]){
                ++ left;
            }else{
                -- right;
            }
        }
        return ans;
    }
}

2,接雨水
https://leetcode.cn/problems/trapping-rain-water/

class Solution {
    public int trap(int[] height) {
        //应该把数组每一个位置当作一个桶,这个桶由左侧和右侧组成
        //而当前的数值大小,可以认为是在这个桶上填满了heigth[i]的石头
        //这个桶剩余的大小才是雨水的。
        //而这个桶的大小取决于左侧边,右侧边中较小的那个,短板
        //而left和right两个桶,根据lmax和rmax的大小比较,优先计算已经确定较小边的那个
        //例如:对于8,0,10,6这个序列。
        //left对应的8已经确定左侧边最小是8,但是它的右侧边此时只知道最小是6,在8到6中间数组数据中有没有比6更大的,不确定
        //而right对应的6右侧最小边是确定的了,但是左侧边不确定,现在只知道至少有个8了。但是有这个8就够了,因为即使8和6之间有一个10,但是桶取决于最小边6. 那如果有一个比6 更小的呢,例如3,那这个不影响当前的right这个桶啊,因为这个桶右侧必然是6了,同时左侧已经确定至少有一个8了,3即使比6小,但他不可能作为当前这个right这个桶两个边。
        int left = 0;
        int right = height.length - 1;
        int lmax = 0;
        int rmax = 0;
        int ans = 0;
        while(left <= right){
            lmax = Math.max(lmax, height[left]);
            rmax = Math.max(rmax, height[right]);
            if(lmax <= rmax){
                ans += lmax - height[left];
                ++ left;
            }else{
                ans += rmax - height[right];
                -- right;
            }
        }
        return ans;

    }
}

相关文章:

  • es如何进行refresh?
  • 利用python实现对Excel文件中数据元组的自定义排序
  • 错误: 加载主类时出现 LinkageError,java.lang.UnsupportedClassVersionError 解决方案
  • MLT媒体程序框架03:滤镜——loudness
  • 蓝桥杯 之 前缀和与查分
  • 智谱AI-大模型调用
  • Linux的缓存I/O和无缓存IO
  • 前端监控体系搭建
  • 游戏树搜索与优化策略:Alpha-Beta剪枝及其实例分析
  • DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元
  • 昇思25天学习打卡营第33天|共赴算力时代
  • 前端性能优化之同时插入100000个元素页面不卡顿
  • my学习网址
  • 2025-3-5 leetcode刷题情况(贪心算法--简单题目)
  • 【监督学习】XGBoost 步骤及matlab实现
  • AI人工智能与实验室应用场景分析
  • 烟花燃放安全管控:智能分析网关V4烟火检测技术保障安全
  • jsp使用+返回or使用数据+日志输出
  • 从0开始的操作系统手搓教程21:进程子系统的一个核心功能——简单的进程切换
  • 数据库监控工具——PMM
  • 网站建设 起飞/如何购买域名
  • 电商网站业务流程/百度图片搜索图片识别
  • 网站建设网上售票系统/福建seo顾问
  • 怎么做物物交换网站/广州网站维护
  • 聊城做wap网站哪儿好/免费制作个人网站
  • 58同城给做网站/互联网精准营销