芝士算法 (双指针篇2.0)

目录

有效三角形个数

查找总价格为目标值的两个商品

三数之和

四数之和


有效三角形个数

有效三角形个数

//先排序

Arrays.sort(nums);

//计算个数

int ret = 0;

int n = nums.length;

for(int i = n - 1 ; i >= 2 ; i--){

//定义左右指针

int left = 0;

int right = i - 1;

//判断大小

while(left < right){

if(nums[left] + nums[right] > nums[i]){

ret+= right - left;

right--;

}else{

left++;

}

}

}

return ret;

查找总价格为目标值的两个商品

查找总价格为目标值的两个商品

这里的思路和上述的保持一致

但是值得注意的一点是

else 中的返回 会接受不到 所以要在最外层 再设置一个返回值

int left = 0 ;

int right = price.length - 1;

while(left < right){

if(price[left] + price [right] < target){

left++;

}else if(price[right] + price[left] > target){

right--;

}else{

return new int[]{price[left],price[right]};

}

}

return new int[]{0};

三数之和

三数之和

List<List<Integer>> ret = new ArrayList<>();

//排序

Arrays.sort(nums);

int n = nums.length;

//deal wiith

for(int i = 0; i < n ;){

if(nums[i] > 0){

break;

}

int left = i + 1;

int right = n - 1;

int target = -nums[i];

while(left < right){

int sum = nums[left] + nums[right];

if(sum < target){

left++;

}else if(sum > target){

right--;

}else{

//找到存放

ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));

left++;

right--;

//去重

while(left<right && nums[left] == nums[left-1]){

left++;

}

while(left<right && nums[right] == nums[right+1]){

right--;

}

}

}

//去重i

i++;

while(i < n && nums[i] == nums[i-1]){

i++;

}}

return ret;

四数之和

四数之和

List<List<Integer>> ret = new ArrayList<>();

//排序

Arrays.sort(nums);

//

int n = nums.length;

for(int i = 0; i < n ;){

for(int j = i+1 ; j < n;){

int left = j + 1 ;

int right = n - 1;

long target1 = (long) target - nums[i] - nums[j];

while(left<right){

int sum = nums[right] + nums[left];

if(sum > target1){

right--;

}else if(sum < target1){

left++;

}else{

ret.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));

left++;

right--;

//去重

while(left < right && nums[left] == nums[left - 1]){

left++;

}

while(left < right && nums[right] == nums[right + 1]){

right--;

}

}

}

//去重 I J

j++;

while(j < n && nums[j] == nums[j - 1]){

j++;

}

}

i++;

while(i < n && nums[i] == nums[i - 1]){

i++;

}

}

return ret;

相关推荐
ZFSS1 小时前
Pika 视频生成 API 集成教程
java·数据库·人工智能·ai·音视频
Chase_______1 小时前
【Java杂项】String 为什么不可变?从对象引用、常量池到字符串拼接讲清楚
java·开发语言
如竟没有火炬1 小时前
有序矩阵中第K小的元素
数据结构·线性代数·算法·leetcode·矩阵·深度优先
qq_2518364571 小时前
基于java Web 耗材购置与维修网络申报审批系统设计与实现
java·开发语言·前端
真恋寄语枫秋1 小时前
【Java零基础入门23】Java线程池深度详解:核心参数、拒绝策略、四种创建方式
java
生活爱好者!1 小时前
用NAS进行漫画创作!一键部署Open WebUI
java·服务器·开发语言·安全·docker
Maddie_Mo1 小时前
Pi Agent Web 使用教程:把本地 Pi Coding Agent 搬进浏览器
android·java·前端·人工智能·ai
小马爱打代码2 小时前
Spring源码 第十二篇:Spring 全套核心原理 - 完结终章
java·后端·spring
洛水水2 小时前
【力扣100题】63.最小覆盖子串
算法·leetcode