演算法學習100天——5 快速排序1
阿新 • • 發佈:2022-03-01
題目地址(75. 顏色分類)
https://leetcode-cn.com/problems/sort-colors/
題目描述
給定一個包含紅色、白色和藍色、共 n 個元素的陣列 nums ,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。 我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。 必須在不使用庫的sort函式的情況下解決這個問題。 示例 1: 輸入:nums = [2,0,2,1,1,0] 輸出:[0,0,1,1,2,2] 示例 2: 輸入:nums = [2,0,1] 輸出:[0,1,2] 提示: n == nums.length 1 <= n <= 300 nums[i] 為 0、1 或 2 進階: 你可以不使用程式碼庫中的排序函式來解決這道題嗎? 你能想出一個僅使用常數空間的一趟掃描演算法嗎?
程式碼
Java Code:
class Solution { /** * 思路:這個題類似於快排演算法,將大於1得數往右挪動,小於1得數往左挪 * * 這個題和快速排序的區別在於: * 快排只需要把數分為兩類,大於等於n + 小於n(或小於等於n + 大於n),而這個題需要分為三類,小於n + 等於n + 大於n * * 本題中,對於三種數的處理方式: * 1.小於,將這個數挪到小於區域(即 將小於區域指標指向的數與nums[i]交換),再i++,因為新換過來的數以及比較過,可以確定比n小; * 2.等於,直接跳過,即i++; * 3.大於,將這個數挪到大於區域(即 將大於區域指標指向的數與nums[i]交換),i不動,因為這個新換過來的數還沒有判斷過. */ public void sortColors(int[] nums) { int left = 0; int right = nums.length - 1; int n = 1; int i = 0; while(i <= right){ if(nums[i] < n){ swap(nums, left++, i++); }else if(nums[i] == n){ i++; }else{ swap(nums, i, right--); } } } private void swap(int[] nums, int a, int b){ int t = nums[a] ^ nums[b]; nums[a] = t ^ nums[a]; nums[b] = t ^ nums[b]; } }
執行結果
執行用時:0 ms, 在所有 Java 提交中擊敗了100.00%的使用者
記憶體消耗:39.8 MB, 在所有 Java 提交中擊敗了19.49%的使用者
本文來自部落格園,作者:ergwang,轉載請註明原文連結:https://www.cnblogs.com/ergwang/p/15952610.html