LeetCode刷题双指针(有效三角形的个数+三数之和)Java

一,有效三角形的个数

解题思路:

因为我们是判断是否可以组成三角形,所以肯定是根据三角形的三边关系,任意两边之和大于第三边来的,但是我们有更好的思路是可以值判断一次的,如下图,那我们根据这个思路,我们就可以将整个数组进行一个排序,然后固定一个最大的,然后剩下的区域定义一个最小值的左指针以及这个区域的最大值的右指针,通过挪动左指针来找到刚好符合条件的数,然后剩下范围的都是可以的,接下来就继续选第二个大,以及刚好符合的左右指针,最后将结果个数相加

代码演示:

java 复制代码
public static void sort(int[] nums){
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]>nums[j]){
                    int tmp=nums[i];
                    nums[i]=nums[j];
                    nums[j]=tmp;
                }
            }
        }
    }
    public static int triangleNumber(int[] nums) {
        //先找到最大的那个数下标,也就是排序之后的最后一个数
        sort(nums);
        int max=nums.length-1;
        //再定义一个三角形个数
        int sum=0;
        while (max>=2){
            int left=0;
            int right=max-1;
            while (left<right){
                if (nums[left]+nums[right]>nums[max]){
                    sum+=right-left;
                    right--;
                }else {
                    left++;
                }
            }
            max--;
        }
        return sum;
    }

二,三数之和

解题思路:

我们这题的主要难度就是如何进行去重的操作,因为我们可以通过暴力的方式一个一个加,但是很可能会出现重复的情况,所以我们主要就是解决重复的问题,那我们的思路就是先将数组进行排序,然后固定一个数a,在剩余的空间里面去寻找两数之和相加为-a的,然后两个指针同时进行移动,如果跟原来的数一样的话,就接着进行移动,这个时候就得注意如果是极端的情况下,两个指针一直移动,也就相当于后面都是重复的,接下来画图进行进一步理解

代码演示:

java 复制代码
class Solution {
            public static void sort(int[] nums){
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]>nums[j]){
                    int tmp=nums[i];
                    nums[i]=nums[j];
                    nums[j]=tmp;
                }
            }
        }
    }
        public List<List<Integer>> threeSum(int[] nums) {
        //先对数组进行排序
        sort(nums);
        // 存放最终的三元组
        List<List<Integer>> ret = new ArrayList<>();
        //先固定第一个数
        for (int i=0;i<nums.length-2;i++){
            if (nums[i]>0){
                break;
            }
             // 对固定的第一个数去重
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int left=i+1;
            int right=nums.length-1;
            //不能越界,所以要进行while循环
            while (left<right){
                if (nums[i]+nums[left]+nums[right]==0){
                    //进行添加
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[i]);
                    list.add(nums[left]);
                    list.add(nums[right]);
                    ret.add(list);
                
                    //对左右指针进行去重
                while (left<right&&nums[left]==nums[left+1]){
                    left++;
                }
                while (left<right&&nums[right]==nums[right-1]){
                    right--;
                }
                left++;
                right--;
                }else if (nums[i]+nums[left]+nums[right]<0){
                    left++;
                }else {
                    right--;
                }
            
            }

        }
        return ret;
    }
}
相关推荐
zwc321043205534 分钟前
第四周第五天——重构成类
c++·人工智能·opencv·算法·计算机视觉
Navigator_Z1 小时前
LeetCode //C - 1311. Get Watched Videos by Your Friends
c语言·算法·leetcode
云析赢指标公式网41 小时前
通达信ATAN均线角度公式源码笔记:四周期角度计算与DRAWBAND色带实现
笔记·算法
21岁被迫秃头1 小时前
SVT-AV1 Mini-Gop决策算法详解+源码分析.md
算法·av1·svt-av1·源码详解·mini-gop决策
Kobebryant-Manba1 小时前
IEKT向量矩阵流程&评估
人工智能·算法·矩阵
八月的雨季 最後的冰吻2 小时前
音视频面试--延迟优化
面试·职场和发展·音视频
Js.Tx2 小时前
【具体数学 Concrete Mathematics】2.1.7 无限和式
算法·具体数学
FPGA信号处理2 小时前
【 凸优化】第六讲:求解器与支持向量机
算法·机器学习·支持向量机
专注仿真2 小时前
支持向量机(SVM)算法详解与代码实例
算法·机器学习·支持向量机
Pniubi2 小时前
力扣42接雨水(动态规划法)
算法·leetcode·职场和发展