LC75 颜色分类
1.读题
2.解题思路
参考题解 快速排序 partition(重点在设计循环不变量)
如题 利用快排的思想 选定标定元素pivot
把数组分成三部分
- 第一部分小于pivot
- 第二部分等于pivot
- 第三部分大于pivot
3.代码逻辑
【1】设置退出条件 如果数组长度小于2 直接return;
【2】预设好三个区间
//[0,zero) 元素都是0
//[zero,i) 都是1
//[two,len - 1]都是2
所以要初始化zero值 two值
【3】进行循环 达到覆盖数组&完成排序的效果
【4】当然 别忘了写下交换的方法 java没有封装好的swap emmmm
4.Java代码
class Solution {
public void sortColors(int[] nums) {
int len = nums.length;
if (len < 2){
return;
}
int zero = 0;//zero是前两个子区间的分界点!
//[0,zero) 元素都是0
//[zero,i) 都是1
//[two,len - 1]都是2
int two = len;
int i = 0;
while(i < two){
//当i == two的时候 上述三个子区间已经覆盖了整个数组
if (nums[i] == 0){
swap(nums, i, zero);
zero ++;
i++;
}
else if(nums[i] == 1){
i ++;
}
else {
two --;
swap(nums, i, two);
}
}
//至此数组已经被覆盖完全(即为排序完成)
}
public void swap(int[] nums, int index1, int index2){
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
【字节校园每日一题】剑指Offer22 链表中倒数第k个节点
记录个快慢指针的舒服方法~
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode slow = head, fast = head;//定义快慢指针
for (int i = 0; i < k; i++) {
fast = fast.next;//fast先走他个k步
}
while(fast != null) {//直到fast快指针走到链表末尾才停止循环
fast = fast.next;
slow = slow.next;
}
return slow;//返回慢指针所指向的(即为倒数第k个节点)
}
}