15_三数之和

简介: 15_三数之和

15_三数之和

 

/**
 *      ★☆ 启发:可以参考完题解:官网的答案,看不懂,★ 可以结合高赞的答案,或者评论区其他详细的解说
 */
package 数组;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
 * https://leetcode-cn.com/problems/3sum/
 * 
 * @author Huangyujun
 *
 * 其实主要思路:在于避免重复: 然后:通过 第一层循环,暂时确定下来第一个数后,target 更新一下
 * 接下来的此情况(只是需要避免重复,然后与57_和为s的连续正数序列 的思考角度一致了): 就是滑动窗口的通用框架2啦
 * 细节:有值传入,特殊值的判断,如果数组为 null 或者数组长度小于 33,返回 []。
 * 处理:对数组进行排序,优化比较查找
 * 细节2:第一个值:nums[i] > 0 ,而数组又已经经过了排序,则直接结束了
 */
public class _15_三数之和 {
    public List<List<Integer>> threeSum(int[] nums) {// 总时间复杂度:O(n^2)
        List<List<Integer>> ans = new ArrayList<>();
        if (nums == null || nums.length <= 2)
            return ans;
        Arrays.sort(nums); // O(nlogn)
        for (int i = 0; i < nums.length - 2; i++) { // O(n^2)
            if (nums[i] > 0)
                break; // 第一个数大于 0,后面的数都比它大,肯定不成立了
            if (i > 0 && nums[i] == nums[i - 1])
                continue; // 去掉重复情况
            int target = -nums[i];
            /**
             * 注意避免重复的滑动窗口的通用框架2啦
             */
            int left = i + 1, right = nums.length - 1;
            while (left < right) {
                //① 结果 == target
                if (nums[left] + nums[right] == target) {
                    ans.add(new ArrayList<>(Arrays.asList(nums[i], nums[left], nums[right])));
                    // 现在要增加 left,减小 right,但是不能重复,比如: [-2, -1, -1, -1, 3, 3, 3], i = 0, left = 1,
                    // right = 6, [-2, -1, 3] 的答案加入后,需要排除重复的 -1 和 3
                    left++;
                    right--; 
                    // 接下来的 while (left < right && nums[left] == nums[left - 1]) 和  while (left < right && nums[right] == nums[right + 1]) 都是避免重复
                    while (left < right && nums[left] == nums[left - 1])
                        left++;
                    while (left < right && nums[right] == nums[right + 1])
                        right--;
                } else if (nums[left] + nums[right] < target) {    //② 结果 < target
                    left++;
                } else { // nums[left] + nums[right] > target    //③ 结果 > target
                    right--;
                }
            }
        }
        return ans;
    }
}
//
//public List<List<Integer>> threeSum(int[] nums) {
//    int a = 0;
//    int b = 1;
//    int c = 2;
//    Arrays.sort(nums);
//    List<List<Integer>> ans = new ArrayList<List<Integer>>();
//    if(nums.length < 3)    return ans;
//    int len = nums.length;
//    int target = 0;
//    while (a <= nums.length - 3) {
//        if(nums[a] > 0)    break;
//        //判断nums[a] 是否与前一个相同,相同则重复,跳过
//        if(a > 0 && nums[a] == nums[--a])    continue;
//        target -= nums[a];
//        while (c <= len) {
//            if (nums[b] + nums[c] == target) {
//                // 记录
//                List<Integer> list = new ArrayList<Integer>();
//                list.add(nums[a]);
//                list.add(nums[b]);
//                list.add(nums[c]);
//                ans.add(list);
//            while (b < c && nums[b] == nums[b - 1]) {
//                b++;
//            }
//            while (b < c && nums[c] == nums[c - 1]) {
//                cleft++;
//            }
//        }
//        a++;
//        b++;
//        c = b + 1;
//    }
//    return ans;
//}



目录
相关文章
|
4天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
7天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
413 93
|
23小时前
|
开发者
「玩透ESA」ESA启用和加速-ER在加速场景中的应用
本文介绍三种配置方法:通过“A鉴权”模板创建函数并设置触发器路由;在ESA上配置回源302跟随;以及自定义响应头。每步均配有详细截图指引,帮助开发者快速完成相关功能设置,提升服务安全性与灵活性。
267 2
|
7天前
|
SQL 人工智能 自然语言处理
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
随着生成式AI的普及,Geo优化(Generative Engine Optimization)已成为企业获客的新战场。然而,缺乏标准化流程(Geo优化sop)导致优化效果参差不齐。本文将深入探讨Geo专家于磊老师提出的“人性化Geo”优化体系,并展示Geo优化sop标准化如何帮助企业实现获客效率提升46%的惊人效果,为企业在AI时代构建稳定的流量护城河。
405 156
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
|
6天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
300 158