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;
    }
}
相关推荐
人工智能培训2 小时前
智能博弈背景下中国AI国防建设的战略价值
大数据·人工智能·算法·重构·生活
flinn_small2 小时前
三分算法:原理、实现与实战应用
数据结构·算法·三分
思茂信息2 小时前
CST软件UV Slice切片后可直接删除指定一侧实体
算法·uv·emc·emi·cst·仿真软件
INGNIGHT3 小时前
944 · 最大子矩阵(前缀和)
数据结构·c++·算法
不要打扰7563 小时前
《房地产经纪操作实务》重点和难点是什么?用哪个题库好
经验分享·职场和发展
All for pursuit.3 小时前
【动态规划-6】96.不同的二叉搜索树
数据结构·c++·算法·leetcode·动态规划
rou4 小时前
Attention(注意力机制)
算法
信奥卷王4 小时前
[GESP202609 六级] 数组划分
数据结构·算法
牧羊人.3334 小时前
动手学深度学习 07|Resnet网络与迁移学习
网络·人工智能·深度学习·神经网络·算法·cnn·迁移学习