国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

LeetCode 179. 最大數【c++/java詳細題解】

tuantuan / 2401人閱讀

摘要:示例輸入輸出示例輸入輸出示例輸入輸出示例輸入輸出思路貪心給定一組非負數,重新排列使其組成一個最大的整數。具體過程如下自定義排序規則函數,將數組按照自定義排序規則重新排序。時間復雜度分析排序的時間復雜度為。

1、題目

給定一組非負整數 nums,重新排列每個數的順序(每個數不可拆分)使之組成一個最大的整數。

注意:

  • 輸出結果可能非常大,所以你需要返回一個字符串而不是整數。

示例 1:

輸入:nums = [10,2]輸出:"210"

示例 2:

輸入:nums = [3,30,34,5,9]輸出:"9534330"

示例 3:

輸入:nums = [1]輸出:"1"

示例 4:

輸入:nums = [10]輸出:"10"

2、思路

(貪心) O ( n l o g n ) O(nlogn) O(nlogn)

給定一組非負數,重新排列使其組成一個最大的整數。

樣例:

如樣例所示,[3,30,34,5,9]所能組成的最大數字是"9534330",下面來講解貪心的做法。

假設給定我們包含兩個數字的數組[a,b],如果"ab"組合大于"ba"組合,那么我們優先選擇a進行拼接。比如nums = [10,2],"210"組合明顯大于"102"組合,因此我們優先選擇2進行拼接,這樣我們就自定義了一個排序規則。

但是擴展到一個序列來講,一個序列要能夠正確地自定義排序,需要這種排序規則滿足全序關系,即以下三個關系:

  • 如果 a ≤ bb ≤ aa = b (反對稱性)
  • 如果 a ≤ bb ≤ ca ≤ c (傳遞性)
  • 如果 a ≤ bb ≤ a (完全性)

詳細證明可看官解。 滿足了全序關系,我們就可以將nums數組按照自定義排序規則重新排序,最后返回拼接好的字符串即可。

實現細節:

c++自定義排序,實現一個cmp函數。

static bool cmp(int a,int b) //自定義排序規則    {        string as = to_string(a), bs = to_string(b);        return as + bs > bs + as;    }

java自定義排序,Arrays.sort()結合lamda表達式。

Arrays.sort(s, (a, b) -> {            String x = a + b, y = b + a ;            return y.compareTo(x); });  

具體過程如下:

  • 1、自定義排序規則函數,將nums數組按照自定義排序規則重新排序。
  • 2、從頭到尾遍歷nums數組,取出nums中的每一個數,拼接到答案字符串res中。
  • 3、判斷字符串res是否是全0,如果是全0,則返回"0",否則返回res。

時間復雜度分析: 排序的時間復雜度 為 O ( n l o g n ) O(nlogn) O(nlogn) 。

3、c++代碼

class Solution {public:    static bool cmp(int a,int b) //自定義排序規則    {        string as = to_string(a), bs = to_string(b);        return as + bs > bs + as;    }    string largestNumber(vector<int>& nums) {        sort(nums.begin(), nums.end(), cmp);        string res;        for(auto x : nums) res += to_string(x);        if(res[0] == "0") return "0"; //判斷是否是全0        return res;    }};

4、java代碼

class Solution {    public String largestNumber(int[] nums) {        int n = nums.length;        String[] s = new String[n];        for (int i = 0; i < n; i++) s[i] = nums[i] + "";        Arrays.sort(s, (a, b) -> {  //自定義排序規則            String x = a + b, y = b + a ;            return y.compareTo(x);        });            StringBuilder res = new StringBuilder();        for (String x : s) res.append(x);    	if(res.charAt(0) == "0") return "0"; //判斷是否是全0        return res.toString();    }}

原題鏈接: 179. 最大數

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/118800.html

相關文章

  • LeetCode 695. 島嶼的最大面積【c++/java詳細題解

    摘要:找到給定的二維數組中最大的島嶼面積。思路給定一個由和組成的二維數組,其中代表島嶼土地,要求找出二維數組中最大的島嶼面積,沒有則返回。樣例如樣例所示,二維數組的最大島嶼面積為,下面來講解深度優先搜索的做法。 ...

    MangoGoing 評論0 收藏0
  • LeetCode 213. 打家劫舍 II【c++/java詳細題解

    摘要:給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,今晚能夠偷竊到的最高金額。狀態表示表示偷竊號到號房間所能獲得的最高金額。下標均從開始打家劫舍我們已經知道了房間單排排列的狀態轉移方程,接下來思考房間環狀排列的做法。 ...

    Kyxy 評論0 收藏0
  • LeetCode 283. 移動零【c++/java詳細題解

    摘要:盡量減少操作次數。樣例如樣例所示,數組,移動完成后變成,下面來講解雙指針的做法。這樣我們就完成了元素的移動,同時也保持了非元素的相對順序。 目錄 1、題目2、思路...

    cnsworder 評論0 收藏0
  • 小李飛刀:做題第十一彈!

    摘要:第五題對稱二叉樹難度簡單給定一個二叉樹,檢查它是否是鏡像對稱的。第十六題最大連續的個數難度簡單給定一個二進制數組,計算其中最大連續的個數。第十八題平方數之和難度簡單給定一個非負整數,你要判斷是否存在兩個整數和,使得。 寫在前面 最近忙著調教新裝備,沒有及時的寫題解,但是沒有在偷懶沒刷題喔~來認真整理下最近做的題目~ 之前考慮按tag來刷題,后來收到了推薦的leetcode題解,就根據上...

    ytwman 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<