一,有效三角形的个数

解题思路:

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

代码演示:
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;
}
}