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()和二分查找经常绑在一起,这样可以提高效率。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值