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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[剑指offer]面试题第[45]题[JAVA][把数组排成最小的数][快排][ Comparator][PriorityQueue]

發布時間:2023/12/10 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指offer]面试题第[45]题[JAVA][把数组排成最小的数][快排][ Comparator][PriorityQueue] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[中等]

【解答思路】


1. 快速排序

時間復雜度:O(N^2) 空間復雜度:O(1)

class Solution {public String minNumber(int[] nums) {String[] strs = new String[nums.length];for(int i = 0; i < nums.length; i++)strs[i] = String.valueOf(nums[i]);fastSort(strs, 0, strs.length - 1);StringBuilder res = new StringBuilder();for(String s : strs)res.append(s);return res.toString();}void fastSort(String[] strs, int l, int r) {if(l >= r) return;int i = l, j = r;String tmp = strs[i];while(i < j) {while((strs[j] + strs[l]).compareTo(strs[l] + strs[j]) >= 0 && i < j) j--;while((strs[i] + strs[l]).compareTo(strs[l] + strs[i]) <= 0 && i < j) i++;tmp = strs[i];strs[i] = strs[j];strs[j] = tmp;}strs[i] = strs[l];strs[l] = tmp;fastSort(strs, l, i - 1);fastSort(strs, i + 1, r);} }
2. 內置函數

時間復雜度:O(N) 空間復雜度:O(1)

class Solution {public String minNumber(int[] nums) {String[] strs = new String[nums.length];for(int i = 0; i < nums.length; i++) strs[i] = String.valueOf(nums[i]);Arrays.sort(strs, (x, y) -> (x + y).compareTo(y + x));StringBuilder res = new StringBuilder();for(String s : strs)res.append(s);return res.toString();} }
3. PriorityQueue

時間復雜度:O(NlogN) 空間復雜度:O(N)

class Solution {/*** 各種組合方式位數都是一樣的, => 誰高位小,就選誰;* 因此本質上就是根據這個做排序,難點在于如何判斷優先級* 判斷高位優先級有好幾種辦法,* 1.拿出兩個數字,逐位對比 vs 位數不相同時,處理比較麻煩* 2.兩個數字加和,例如 n , m 對應有 n * pow(10,m) + m 和 m * pow(10,n) + n,誰小選誰,但是int溢出* 3.直接字符串相加, "nm" 與 "mn" 作比較。* tips:* 1.影響性能的關鍵就在于排序算法了;* 2.經過思考,兩個數字的優先級與其他數字無關!* */public static int compare (int num1 , int num2) {if (num1 == num2) return 0;String nm = new String(num1 + "" + num2);String mn = new String(num2 + "" + num1);return nm.compareTo(mn);}public static String minNumber(int[] nums) {if (nums == null || nums.length == 0) return "";String rx = "";int n = nums.length;PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((o1, o2) -> compare(o1,o2));for (int num : nums) {priorityQueue.add(num);}while (!priorityQueue.isEmpty()) {rx += priorityQueue.poll();}return rx;} }

【總結】

1.快排最后不熟悉
void fastSort(String[] strs, int l, int r) {if(l >= r) return;int i = l, j = r;String tmp = strs[i];while(i < j) {while((strs[j] + strs[l]).compareTo(strs[l] + strs[j]) >= 0 && i < j) j--;while((strs[i] + strs[l]).compareTo(strs[l] + strs[i]) <= 0 && i < j) i++;tmp = strs[i];strs[i] = strs[j];strs[j] = tmp;//當i==j時 tmp=ij交匯處的值 }//最后把“ij交互處”置換成基準值strs[i] = strs[l];strs[l] = tmp;fastSort(strs, l, i - 1);fastSort(strs, i + 1, r);}

等價于

void fastSort(String[] strs,int l ,int r){if(l>=r) return ;int i = l,j =r;String key= strs[i];while(i<j){while((strs[j] + strs[l]).compareTo(strs[l] + strs[j]) >= 0 && i < j) j--;while((strs[i] + strs[l]).compareTo(strs[l] + strs[i]) <= 0 && i < j) i++;String tmp = strs[i];strs[i] = strs[j];strs[j] = tmp;}//先把”ij交互處置的值“挪到前排strs[l] = strs[i];//最后把“ij交互處”置換成基準值strs[i] = key;fastSort(strs, l, i - 1);fastSort(strs, i + 1, r);}
2. Arrays.sort(strs, (x, y) -> (x + y).compareTo(y + x));

轉載鏈接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/mian-shi-ti-45-ba-shu-zu-pai-cheng-zui-xiao-de-s-4/

Java實現快排:https://blog.csdn.net/qq_36186690/article/details/82470451

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[剑指offer]面试题第[45]题[JAVA][把数组排成最小的数][快排][ Comparator][PriorityQueue]的全部內容,希望文章能夠幫你解決所遇到的問題。

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