Leetcode.611.有效三角形个数之Arrays.sort和二分查找
前言
刷算法打卡中.
主要是想记录一下改进版,体现一下在有序情况下一定要想到二分查找法,真的很好用。而排序用Arrays.sort(),时间复杂度O(nlogn)。
一、问题
1、问题分析
输入nums,给它排个序,"巧"穷尽所有3元组。
2、问题转换
使用Arrays.sort()排序,然后按三角形的规则穷尽匹配。
3、写代码之前
public class TriangleNumber {
public int triangleNumber(int[] nums) {
/*
* 问题分析
* 输入nums,给它排个序,"巧"穷尽所有3元组。
* 转换问题
* 使用Arrays.sort()排序,然后按三角形的规则穷尽匹配
*/
// 1. 用ArrayList给nums排个序
// 2. 用三层for循环去穷尽匹配,顺便计数
// 3. 最后返回所计的数
}
}
4、写代码之后
public class TriangleNumber {
public int triangleNumber(int[] nums) {
/*
* 问题分析
* 输入nums,给它排个序,"巧"穷尽所有3元组。
* 转换问题
* 使用Arrays.sort()排序,然后按三角形的规则穷尽匹配
*/
// 1. 用ArrayList给nums排个序
Arrays.sort(nums);
// 2. 用两层for循环去穷尽匹配,顺便计数
int count = 0;
for (int i = 0; i < nums.length - 2; i++) {
for (int j = i + 1; j < nums.length - 1; j++) {
for(int n=0;n<nums.length,n++){
//因为是有序的,所以可以直接这样判断
if(num[i]+nums[j]>nums[n]){
count++;continue;
}
break;
}
}
}
// 3. 最后返回所计的数
return count;
}
}
5、改进之后
我们发现这次提交用时很多。而本身数组是有序的,所以可以用二分查找到最大第三边。
public class TriangleNumber {
public int triangleNumber(int[] nums) {
/*
* 问题分析
* 输入nums,给它排个序,"巧"穷尽所有3元组。
* 转换问题
* 使用Arrays.sort()排序,然后按三角形的规则穷尽匹配
*/
// 1. 用ArrayList给nums排个序
Arrays.sort(nums);
// 2. 用两层for循环去穷尽匹配,顺便计数
int count = 0;
for (int i = 0; i < nums.length - 2; i++) {
for (int j = i + 1; j < nums.length - 1; j++) {
int index = getIndex(j + 1, nums.length, nums[i] + nums[j], nums);
count += (index - j);
}
}
// 3. 最后返回所计的数
return count;
}
private int getIndex(int low, int high, int data, int[] nums) {
// TODO Auto-generated method stub
while (low < high) {
int mid = (low + high) / 2;
if (nums[mid] < data) {
low = mid + 1;
} else
high = mid;
}
return low;
}
}
二、算法评估
1、时间复杂度
O(n2),n为nums.length。
2、空间复杂度
O(1)
三、收获
Arrays.sort()和二分查找经常绑在一起,这样可以提高效率。