LeetCode刷题双指针(有效三角形的个数+三数之和)Java
一有效三角形的个数解题思路因为我们是判断是否可以组成三角形所以肯定是根据三角形的三边关系任意两边之和大于第三边来的但是我们有更好的思路是可以值判断一次的如下图那我们根据这个思路我们就可以将整个数组进行一个排序然后固定一个最大的然后剩下的区域定义一个最小值的左指针以及这个区域的最大值的右指针通过挪动左指针来找到刚好符合条件的数然后剩下范围的都是可以的接下来就继续选第二个大以及刚好符合的左右指针最后将结果个数相加代码演示public static void sort(int[] nums){ for(int i0;inums.length;i){ for(int ji1;jnums.length;j){ if(nums[i]nums[j]){ int tmpnums[i]; nums[i]nums[j]; nums[j]tmp; } } } } public static int triangleNumber(int[] nums) { //先找到最大的那个数下标也就是排序之后的最后一个数 sort(nums); int maxnums.length-1; //再定义一个三角形个数 int sum0; while (max2){ int left0; int rightmax-1; while (leftright){ if (nums[left]nums[right]nums[max]){ sumright-left; right--; }else { left; } } max--; } return sum; }二三数之和解题思路我们这题的主要难度就是如何进行去重的操作因为我们可以通过暴力的方式一个一个加但是很可能会出现重复的情况所以我们主要就是解决重复的问题那我们的思路就是先将数组进行排序然后固定一个数a在剩余的空间里面去寻找两数之和相加为-a的然后两个指针同时进行移动如果跟原来的数一样的话就接着进行移动这个时候就得注意如果是极端的情况下两个指针一直移动也就相当于后面都是重复的接下来画图进行进一步理解代码演示class Solution { public static void sort(int[] nums){ for(int i0;inums.length;i){ for(int ji1;jnums.length;j){ if(nums[i]nums[j]){ int tmpnums[i]; nums[i]nums[j]; nums[j]tmp; } } } } public ListListInteger threeSum(int[] nums) { //先对数组进行排序 sort(nums); // 存放最终的三元组 ListListInteger ret new ArrayList(); //先固定第一个数 for (int i0;inums.length-2;i){ if (nums[i]0){ break; } // 对固定的第一个数去重 if (i 0 nums[i] nums[i - 1]) { continue; } int lefti1; int rightnums.length-1; //不能越界所以要进行while循环 while (leftright){ if (nums[i]nums[left]nums[right]0){ //进行添加 ListInteger list new ArrayList(); list.add(nums[i]); list.add(nums[left]); list.add(nums[right]); ret.add(list); //对左右指针进行去重 while (leftrightnums[left]nums[left1]){ left; } while (leftrightnums[right]nums[right-1]){ right--; } left; right--; }else if (nums[i]nums[left]nums[right]0){ left; }else { right--; } } } return ret; } }