当前位置: 首页 > article >正文

0205算法:最长连续序列、三数之和、排序链表

力扣128:最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

class Solution {
    public int longestConsecutive(int[] nums) {
        //整体思路:
        //将所有的元素都添加到hashset中
        //找到最小的起点,才开始进行判断他有多长
        //判断最长的方法:找到当前值,然后+1 判断在Set中是否存在,并更新最大长度

        //解题步骤:
        //将元素添加到Set中:
        Set<Integer> demo = new HashSet<Integer>();
        for(int num:nums){
            demo.add(num);
        }
        int maxlong = 0;
        //遍历找到最小起始节点:
        for(int num:demo){
            if(!demo.contains(num-1)){
                int currentNum = num;
                int currentLong = 1;

                //找出每个初始节点的最长路径
                while (demo.contains(currentNum+1)){
                    currentNum +=1;
                    currentLong+=1;
                }
                //更新最大长度
                maxlong = Math.max(currentLong,maxlong);
            }
        }
        return maxlong;
    }
}

力扣15:三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        //存放结果
        List<List<Integer>> demo = new ArrayList<>();
        Arrays.sort(nums);
        //更新i,缩短距离
        for(int i=0;i<nums.length-2;i++){
            //去重,【只用出现的第一个不同的】
            int x= nums[i];
            if(i>0&&x==nums[i-1]) continue;//去重,【只用出现的第一个不同的】
            int j = i+1;
            int k = nums.length-1;
            //进行循环两个jk
            while(j<k){
                int s = x+nums[j] + nums[k];
                if(s>0){
                    k--;
                }else if(s<0){
                    j++;
                }else{
                    //添加到结果集
                    demo.add(List.of(x,nums[j],nums[k]));
                    //去重,【只用出现的第一个不同的】
                    for(j++;j<k && nums[j]==nums[j-1];j++);
                    for(k--;k>j && nums[k]==nums[k+1];k--);
                }
            }
        }
        return demo;
    }
}

力扣148:排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    //该方法的作用:将head为始的链表对半拆分,然后分别递归进行排序,然后将两个排好序的链表组装并排序。
    public ListNode sortList(ListNode head) {
        //时间复杂度为logn,可以使用归并排序
        //由于是链表,所以需要在每个方法的内部进行拆分
        
        //结束条件
        if(head ==null || head.next==null){
            return head;
        }
        
        ListNode fast = head.next;
        ListNode slow = head;

        //对半分
        while(fast!=null && fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode tmp = slow.next;
        slow.next=null;

        //递归获得排好序的子链表
        ListNode left = sortList(head);
        ListNode right = sortList(tmp);

        //将两个链表进行排序
        ListNode h = new ListNode(0);
        ListNode res = h;
        while(left!=null && right!=null){
            if(left.val<right.val){
                h.next = left;
                h=h.next;
                left=left.next;
            }else{
                h.next = right;
                h=h.next;
                right = right.next;
            }
        }
        //将剩余的结果链接起来
        h.next = left!=null?left:right;
        return res.next;

    }
}


http://www.kler.cn/a/533644.html

相关文章:

  • hot100(7)
  • git submodules
  • 《redis哨兵机制》
  • idea分析sql性能
  • Deepseek本地部署(ollama+open-webui)
  • Mac M1 Comfyui 使用MMAudio遇到的问题解决?
  • 2024年12月 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试
  • 工作总结:上线篇
  • 你也在这里
  • MYSQL简单查询
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter3-语言基础
  • 力扣-哈希表-1 两数之和
  • Baklib如何实现内容管理平台的智能化升级与数据整合
  • Docker深度解析:安装各大环境
  • [加餐]指针和动态内存管理
  • 网络安全——Span 安全监控
  • 请求响应(接上篇)
  • 【字节青训营-9】:初探字节微服务框架 Hertz 基础使用及进阶(下)
  • 基于Java、SSM、HTML、Vue在线视频教学网课管理系统设计
  • 视频效果中的演化及演化选项
  • 【C++】多态详细讲解
  • R语言应用KNN、朴素贝叶斯、SVM实现手写数字识别
  • 【人工智能】通用人工智能 AGI
  • 文本分析NLP的常用工具和特点
  • 关于大数据
  • 第一天:Linux内核架构、文件系统和进程管理