1004. 最大连续1的个数 III
思路:维护一个滑动窗口,保证其窗口内的0不大于k
java
class Solution {
public int longestOnes(int[] nums, int k) {
int left=0;
int n=nums.length;
int lsum=0, rsum=0;
int ans=0;//
for(int right=0; right<n; right++){
rsum+=1-nums[right];//起始点到右指针之间的0的个数
while(rsum-lsum>k){
lsum+=1-nums[left];//左指针之前的0个数
left++;
}
ans =Math.max(ans,right-left+1);//
}
return ans;
}
}
92. 反转链表 II

代码步骤:先设置一个dummyNode
通过循环找到起始点left的前一节点
开始left-right次反转
java
//思路,先有一个prev指向left节点,然后再进行反转
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dummy= new ListNode(-1);
dummy.next=head;
ListNode prev=dummy;
for(int i=0;i<left-1;i++){
prev=prev.next;//先到left节点的前一个节点
}
ListNode curr=prev.next;
ListNode next;
for(int i=0;i<right-left;i++){
next=curr.next;
curr.next=next.next;
next.next=prev.next;
prev.next=next;
}
return dummy.next;
}
}
142. 重排链表
中点-翻转-穿插merge
java
class Solution {
public void reorderList(ListNode head) {
ListNode slow=head;
ListNode fast=head;
while(fast.next!=null && fast.next.next!=null){
slow=slow.next;
fast=fast.next.next;
}
ListNode mid=slow;
ListNode l2=mid.next;
mid.next=null;
l2=reverseList(l2);
ListNode l1=head;
mergeList(l1,l2);
//return head;
}
public ListNode reverseList(ListNode node){
ListNode curr=node;
ListNode prev=null;
while(curr!=null){
ListNode next=curr.next;
curr.next=prev;
prev=curr;
curr=next;
}
return prev;//curr,想一想最后是curr=null就停止循环,此时的最后一个node是curr,所以头节点是prev
}
public void mergeList(ListNode l1,ListNode l2){
while(l1!=null && l2!=null){
ListNode l1_temp=l1.next;
ListNode l2_temp=l2.next;
l1.next=l2;
l2.next=l1_temp;
l1=l1_temp;//l1=l1.next;
l2=l2_temp;//l2=l2.next;
}
}
}