日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode——排序

發布時間:2024/2/28 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode——排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

排序


目錄

  • 快速選擇
  • 桶排序之出現頻率最多的k個元素
  • 桶排序之按照字符出現次數對字符串排序
  • 荷蘭國旗問題

  • 1. 快速選擇

    用于解 Kth Element 問題,也就是第 k 個元素的問題。

    可以用快速排序的 partition() 進行實現。需要先打亂數組,否則最壞情況下時間復雜度為 O(N^2 )。

    public int findKthLargest(int[] nums, int k) {int begin = 0;int end = nums.length - 1;k = nums.length + 1 - k;while (begin < end) {int pos = partition(nums, begin, end);if (pos == k - 1)break;else if (pos < k - 1)begin = pos + 1;elseend = pos - 1;}return nums[k - 1];}public int partition(int[] nums, int l, int r) {int less = l - 1;//小于區的下標int more = r;//大于區的下標,默認以最后一個下標的數作為劃分值while (l < more) {if (nums[l] < nums[r])swap(nums, ++less, l++);else if (nums[l] > nums[r])swap(nums, --more, l);else l++;}swap(nums, more, r);return less + 1;//小于區位置+1可以得到劃分的這個數的下標}private void swap(int[] arr, int i, int j) {int t = arr[i];arr[i] = arr[j];arr[j] = t;}

    需要去重的話可以利用HashSet或其他數據結構得到所有唯一的數字,然后使用本算法處理。


    2. 堆

    用于求解 TopK Elements 問題,也就是 K 個最小元素的問題。可以維護一個大小為 K 的最小堆,最小堆中的元素就是最小元素。最小堆需要使用大頂堆來實現,大頂堆表示堆頂元素是堆中最大元素。這是因為我們要得到 k 個最小的元素,因此當遍歷到一個新的元素時,需要知道這個新元素是否比堆中最大的元素更小,更小的話就把堆中最大元素去除,并將新元素添加到堆中。所以我們需要很容易得到最大元素并移除最大元素,大頂堆就能很好滿足這個要求。

    堆也可以用于解決 Kth Element 問題,得到了大小為 k 的最小堆之后,因此使用了大頂堆來實現,因此堆頂元素就是第 k 大的元素。

    快速選擇也可以求解 TopK Elements 問題,因為找到 Kth Element 之后,再遍歷一次數組,所有小于等于 Kth Element 的元素都是 TopK Elements。

    可以看到,快速選擇和堆排序都可以解決 Kth Element 和 TopK Elements 問題。


    排序:時間復雜度 O(NlogN),空間復雜度 O(1)

    public int findKthLargest(int[] nums, int k) {Arrays.sort(nums);return nums[nums.length - k];}

    堆:時間復雜度 O(NlogK),空間復雜度 O(K)。

    public int findKthLargest1(int[] nums, int k) {PriorityQueue<Integer> pq = new PriorityQueue<>(); //小頂堆for (int val : nums) {pq.add(val);if (pq.size() > k) { //維護堆的大小為 Kpq.poll();}}return pq.peek();}

    3. 桶排序

    1. 之出現頻率最多的k個元素


    設置若干個桶,每個桶存儲出現頻率相同的數。桶的下標表示數出現的頻率,即第 i 個桶中存儲的數出現的頻率為 i。

    把數都放到桶之后,從后往前遍歷,最先得到的 k 個數就是出現頻率最多的 k 個數。

    public static List<Integer> topKFrequent(int[] nums, int k) {Map<Integer, Integer> frequencyForNum = new HashMap<>();for (int num : nums) {frequencyForNum.put(num, frequencyForNum.getOrDefault(num, 0) + 1);}List<Integer>[] buckets = new ArrayList[nums.length + 1];for (Integer key : frequencyForNum.keySet()) {int frequency = frequencyForNum.get(key);if (buckets[frequency] == null) {buckets[frequency] = new ArrayList<>();}buckets[frequency].add(key);}List<Integer> topK = new ArrayList<>();for (int i = buckets.length - 1; i >= 0 && topK.size() < k; i--) {if (buckets[i] == null) {continue;}if (buckets[i].size() <= (k - topK.size())) {topK.addAll(buckets[i]);} else {topK.addAll(buckets[i].subList(0, k - topK.size()));}}return topK;}
    2. 按照字符出現次數對字符串排序

    public String frequencySort(String s) {Map<Character, Integer> map = new HashMap<>();for (char c : s.toCharArray()) {map.put(c, map.getOrDefault(c, 0) + 1);}List<Character>[] buckets = new ArrayList[s.toCharArray().length + 1];for (Character c : map.keySet()) {Integer value = map.get(c);if (buckets[value] == null) {buckets[value] = new ArrayList<>();}buckets[value].add(c);}StringBuilder str = new StringBuilder();for (int i = buckets.length - 1; i >= 0; i--) {if (buckets[i] == null) {continue;}for (Character character : buckets[i]) {for (int j = 0; j < i; j++) {str.append(character);}}}return str.toString();}

    5. 荷蘭國旗問題

    荷蘭國旗包含三種顏色:紅、白、藍。

    有三種顏色的球,算法的目標是將這三種球按顏色順序正確地排序。它其實是三向切分快速排序的一種變種,在三向切分快速排序中,每次切分都將數組分成三個區間:小于切分元素,等于切分元素,大于切分元素,而該算法是將數組分成三個區間:等于紅色、等于白色、等于藍色。

    1. 按顏色進行排序


    題目描述:只有 0/1/2 三種顏色。

    public void sortColors(int[] nums) {int zero = -1;int one = 0;int two = nums.length;while (one < two) {if (nums[one] == 0) {swap(nums, ++zero, one++);} else if (nums[one] == 2) {swap(nums, --two, one);} else {one++;}}}private void swap(int[] nums, int i, int j) {int t = nums[i];nums[i] = nums[j];nums[j] = t;}

    總結

    以上是生活随笔為你收集整理的LeetCode——排序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。