import java.util.Arrays;
public class Solution2 {
public int triangleNumber(int[] nums) {
// 索引数组:[0, 1, 2, 3, 4],size = 5
// i 最多到倒数第 2 个索引
int len = nums.length;
// 思路 2:从后到前,先固定 k ,再固定 j ,最后确定 i 的范围
// 首先不要忘记排序
Arrays.sort(nums);
int res = 0;
// 注意边界,看上面那个索引数组知道 k 最小取到 2,不能再小了
for (int k = len - 1; k > 1; k--) {
// 要给 k 留一个位置,故 size - 1 是上限(取不到)
for (int j = k - 1; j > 0; j--) {
// 在区间 [0, j - 1] 中找第 1 个能构成三角形的数
// i 与 j 之间的数的个数就是一票解
// 等价于,在子区间 [0, j - 1] 里找第 1 个大于(不能等于) nums[k] - nums[j] 的数
int i = findFirstCanTriangle(nums, 0, j - 1, nums[k] - nums[j]);
if (i == -1) {
// 说明子区间 [0, j - 1] 全部的数都不能构成三角形
// 其中的数的个数为 0,
// 为了语义清晰,我还是写一下 + 0
res += 0;
} else {
// 说明子区间 [i, j - 1] 全部的数可以构成三角形,注意:这里 k 取不到
// 其中的数的个数为 j - 1 - i + 1
res += (j - i);
}
}
}
return res;
}
private int findFirstCanTriangle(int[] nums, int left, int right, int target) {
// 在 nums 的子区间 [left, right] 里找第 1 个大于(不能等于) target 的元素的索引
// 如果不存在,返回 -1
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] <= target) {
left = mid + 1;
} else {
right = mid;
}
}
// 后处理,因为很有可能找不到大于等于 target 的元素
if (nums[left] <= target) {
return -1;
}
return left;
}
}

Ddddddd_158
- 粉丝: 3167
最新资源
- Laravel5微信小程序登录获取用户信息扩展.zip
- D时间无关薛定谔方程求解器_3D Time independent Schroedinger equation solv
- 抖音电商,分行业topX商品基础数据+销量数据,提供小程序和api查询.zip
- Schlecht,S.,Alary,B.,V lim ki,V.,Habets,E.的Matlab代码()。优化天鹅绒噪
- 软件_matlab.zip
- 微信小程序AR测试.zip
- 佛罗里达州富尔尔。MW风力发电机组数据集预处理函数R MATLAB_Fuhrländer FL2500 2.5MW wi
- 使用MATLAB引擎的语言服务器_Language Server using MATLAB Engine.zip
- MATLAB实现直方图均衡_Histogram Equalization Implementation by MATLA
- 数字图像水印使用matlab(DWT、DCT),GUI使用python_Digital Image Watermarki
- 该MATLAB项目可以对Agilent_E A LCR仪表进行数据监测和记录。_This MATLAB project
- 微信小程序 Sports News(体育新闻).zip
- MATLAB的TOML实现_TOML implementation for MATLAB.zip
- wechat mini program swipe card component(微信小程序卡片滑动组件).zip
- 微信小程序自定义样式轮播图,阴影、动画缩放、中间大两边小.zip
- 使用zbar扫描,zxing生成和读取本地二维码图片.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


