Leetcode--75. 颜色分类
給定一個包含紅色、白色和藍色,一共?n 個元素的數組,原地對它們進行排序,使得相同顏色的元素相鄰,并按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、?1 和 2 分別表示紅色、白色和藍色。
注意:
不能使用代碼庫中的排序函數來解決這道題。
示例:
輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
進階:
一個直觀的解決方案是使用計數排序的兩趟掃描算法。
首先,迭代計算出0、1 和 2 元素的個數,然后按照0、1、2的排序,重寫當前數組。
你能想出一個僅使用常數空間的一趟掃描算法嗎?
方法一:時間復雜度:o(n^2)
一個排序算法就可以
public class Solution75 {
?? ? public static void sortColors(int[] nums) {
?? ? ? ? ? ?int i,j,t;
?? ? ? ? ? ?int n = nums.length;
?? ? ? ? ? ?for(i=0;i<n-1;i++)
?? ? ? ? ? ?{
?? ? ? ? ? ??? ?for(j=0;j<n-1-i;j++)
?? ? ? ? ? ??? ?{
?? ? ? ? ? ??? ??? ?if(nums[j]>nums[j+1])
?? ? ? ? ? ??? ??? ?{
?? ? ? ? ? ??? ??? ??? ?t = nums[j];
?? ? ? ? ? ??? ??? ??? ?nums[j] = nums[j+1];
?? ? ? ? ? ??? ??? ??? ?nums[j+1] = t;
?? ? ? ? ? ??? ??? ?}
?? ? ? ? ? ??? ?}
?? ? ? ? ? ?}
?? ? ? ? ? ?for(i=0;i<n;i++)
?? ? ? ? ? ?{
?? ? ? ? ? ??? ?System.out.println(nums[i]);
?? ? ? ? ? ?}
?? ? ? ?}
?? ? public static void main(String[] args)
?? ? {
?? ??? ? int[] nums = {2,0,2,1,1,0};
?? ??? ? sortColors(nums);
?? ? }
}
方法二:三指針法??時間復雜度:o(n)
一個指針從頭遍歷,一個指針判斷0的個數,記錄0的右邊界,一個指針判斷2的個數,記錄2的左邊界
當nums[i]的值為0,1是,都會i++,而值為2時,無此操作。
原因是后面位置上可能本來也是2,會換到前面,那就需要把這個2繼續向后換
而值為0時他是相當于交換自己,所以無此考慮,可以執行i++
值為1時,1本來也要放在中間,也無需考慮
public class Solution75 {
?? ? public static void sortColors(int[] nums) {
?? ??? ? int flag1,flag3;
?? ??? ? int i,t;
?? ??? ? int n = nums.length;
?? ??? ? flag1 = 0;
?? ??? ? flag3 = n-1;
?? ??? ? for(i=0;i<n;)
?? ??? ? {
?? ??? ??? ? if(i>flag3||i<flag1)
?? ??? ??? ? {
?? ??? ??? ??? ? break;
?? ??? ??? ? }
?? ??? ??? ??
?? ??? ??? ? if(nums[i]==0)
?? ??? ??? ? {
?? ??? ??? ??? ? t = nums[i];
?? ??? ??? ??? ? nums[i] = nums[flag1];
?? ??? ??? ??? ? nums[flag1] = t;
?? ??? ??? ??? ? flag1++;
?? ??? ??? ??? ? i++;
?? ??? ??? ? }
?? ??? ??? ? else if(nums[i]==2)
?? ??? ??? ? {
?? ??? ??? ??? ? t = nums[i];
?? ??? ??? ??? ? nums[i] = nums[flag3];
?? ??? ??? ??? ? nums[flag3] = t;
?? ??? ??? ??? ? flag3--;
?? ??? ??? ? }
?? ??? ??? ? else
?? ??? ??? ? {
?? ??? ??? ??? ? i++;
?? ??? ??? ? }
?? ??? ? }
?? ??? ? for(i=0;i<n;i++)
?? ??? ? {
?? ??? ??? ? System.out.println(nums[i]);
?? ??? ? }
?? ? ? ?}
?? ? public static void main(String[] args)
?? ? {
?? ??? ? int[] nums = {2,0,2,1,1,0};
?? ??? ? sortColors(nums);
?? ? }
}
?
總結
以上是生活随笔為你收集整理的Leetcode--75. 颜色分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Web实现信息管理
- 下一篇: 第二章 数据的表示和运算 2.1.4 奇