力扣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 != j
、i != 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;//进行循环两个jkwhile(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;}
}