leetcode75(颜色分类:双指针法)

    科技2024-07-26  16

    给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 注意: 不能使用代码库中的排序函数来解决这道题。

    示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]

    题解(一):快速排序,这道题使用排序算法就可以解决,无论是冒泡法还是快排

    class Solution { public void sortColors(int[] nums) { quickSort(nums,0,nums.length-1); } private void quickSort(int[]nums,int left,int right){ if(left>right) return; int start=left; int end=right; int pivot=start; while(start<end){ while(nums[pivot]<nums[end]&&start<end) end--; while(nums[pivot]>=nums[start]&&start<end) start++; changeEle(nums,start,end); } changeEle(nums,start,pivot); quickSort(nums,left,start-1); quickSort(nums,start+1,right); } private void changeEle(int[]nums,int x,int y){ int temp=nums[x]; nums[x]=nums[y]; nums[y]=temp; } }

    题解(二):双指针法,维护两个指针ptr0和ptr1(最初指向数组中的第一个元素),同时遍历数组,如果遍历到的数字nums[ i ]==0,则交换元素nums[ i ]和nums[ ptr0 ],然后ptr0、ptr1向前移动,如果遍历到的数字nums[ i ]==1,则交换元素nums[ i ]和nums[ ptr1 ],然后ptr1向前移动,这样就可以在遍历数组的过程中完成排序任务,当然同时要注意算法的细节处理——如果遍历到nums[ i ]==0,如果在交换前ptr0<ptr1,则肯定nums[ptr0]=1,则在交换nums[ i ]和nums[ptr0]时,会把元素1交换出去,这时我们要继续交换nums[ i ]和nums[ptr1],重新将1换到正确位置

    class Solution { public void sortColors(int[] nums) { int ptr0=0; int ptr1=0; for(int i=0;i<nums.length;i++){ if(nums[i]==1) { changeEle(nums, i, ptr1); ptr1++; } else if(nums[i]==0){ changeEle(nums,i,ptr0); ptr1++; ptr0++; if(ptr0<ptr1){ changeEle(nums,i,ptr0); } } } } private void changeEle(int[]nums,int x,int y){ int temp=nums[x]; nums[x]=nums[y]; nums[y]=temp; } }
    Processed: 0.027, SQL: 8