非hot100的力扣算法题
1004. 最大连续1的个数 III思路维护一个滑动窗口保证其窗口内的0不大于kclass Solution { public int longestOnes(int[] nums, int k) { int left0; int nnums.length; int lsum0, rsum0; int ans0;// for(int right0; rightn; right){ rsum1-nums[right];//起始点到右指针之间的0的个数 while(rsum-lsumk){ lsum1-nums[left];//左指针之前的0个数 left; } ans Math.max(ans,right-left1);// } return ans; } }92. 反转链表 II代码步骤先设置一个dummyNode通过循环找到起始点left的前一节点开始left-right次反转//思路先有一个prev指向left节点然后再进行反转 class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { ListNode dummy new ListNode(-1); dummy.nexthead; ListNode prevdummy; for(int i0;ileft-1;i){ prevprev.next;//先到left节点的前一个节点 } ListNode currprev.next; ListNode next; for(int i0;iright-left;i){ nextcurr.next; curr.nextnext.next; next.nextprev.next; prev.nextnext; } return dummy.next; } }142. 重排链表中点-翻转-穿插mergeclass Solution { public void reorderList(ListNode head) { ListNode slowhead; ListNode fasthead; while(fast.next!null fast.next.next!null){ slowslow.next; fastfast.next.next; } ListNode midslow; ListNode l2mid.next; mid.nextnull; l2reverseList(l2); ListNode l1head; mergeList(l1,l2); //return head; } public ListNode reverseList(ListNode node){ ListNode currnode; ListNode prevnull; while(curr!null){ ListNode nextcurr.next; curr.nextprev; prevcurr; currnext; } return prev;//curr想一想最后是currnull就停止循环此时的最后一个node是curr所以头节点是prev } public void mergeList(ListNode l1,ListNode l2){ while(l1!null l2!null){ ListNode l1_templ1.next; ListNode l2_templ2.next; l1.nextl2; l2.nextl1_temp; l1l1_temp;//l1l1.next; l2l2_temp;//l2l2.next; } } }23.合并K个升序链表思路借助最小堆维护多条链表的首节点每次取出堆顶最小值节点拼接结果并将该节点后继入堆逐步完成合并//最小堆最小的那个就得next class Solution { public ListNode mergeKLists(ListNode[] lists) { PriorityQueueListNode queuenew PriorityQueue((a,b)-(a.val-b.val));//最小堆排序 for(ListNode head:lists){ if(head!null){//要加判断防止把 null 存入优先队列避免后续空指针异常 queue.offer(head); } } ListNode dummynew ListNode(0); ListNode currdummy; while(!queue.isEmpty()){ ListNode nodequeue.poll(); if(node.next!null){ queue.offer(node.next); } curr.nextnode;//currnode; currcurr.next; } return dummy.next; } }时间O(nlogk)n 为总节点数k 为链表条数堆操作耗时 O(logk)。堆的插入、弹出堆顶时间复杂度都是 O(log {堆大小})空间O(k)堆最多存储 k 个节点