2024-03-08 leetcode寫題記錄

FlyingLight發表於2024-03-08

目錄
  • 2024-03-08 leetcode寫題記錄
    • 27. 移除元素
      • 題目連結
      • 題意
      • 解法
    • 179. 最大數
      • 題目連結
      • 題意
      • 解法
    • 75. 顏色分類
      • 題目連結
      • 題意
      • 解法

2024-03-08 leetcode寫題記錄

27. 移除元素

題目連結

27. 移除元素

題意

給你一個陣列\(nums\)和一個值\(val\),你需要原地移除所有數值等於\(val\)的元素,並返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須僅使用\(O(1)\)額外空間並原地修改輸入陣列。

元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素

解法

遍歷一遍,把不等於\(val\)的值都\(swap\)到前面即可。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int n = nums.size(), idx = 0;
        for (int i = 0; i < n; ++i) {
            if (nums[i] == val)
                continue;
            swap(nums[idx], nums[i]);
            idx++;
        }
        return idx;
    }
};

179. 最大數

題目連結

170. 最大數

題意

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

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

解法

用貪心的想法想一下,兩個數的比較其實就是在比哪個數在前時能讓整個數變得更大。

注意,\(f()\)會爆\(int\)

class Solution {
   public:
    int f(int x) {
        long long res = 10;
        while(x >= res) res *= 10;
        return res;
    }

    string largestNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end(), [&](int& x, int& y) {
            int xx = f(x), yy = f(y);
            return 1ll * x * yy + y > 1ll * y * xx + x;
        });
        if (nums[0] == 0) return "0";
        string res = "";
        for (int x : nums)
            res += to_string(x);
        return res;
    }
};

75. 顏色分類

題目連結

  1. 顏色分類

題意

給定一個包含紅色、白色和藍色、共\(n\)個元素的陣列\(nums\),原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

我們使用整數\(0、1\)\(2\)分別表示紅色、白色和藍色。

必須在不使用庫內建的\(sort\)函式的情況下解決這個問題。

解法

遍歷一遍,是\(0\)就扔左邊,是\(2\)就扔右邊,處理好邊界就行了。

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int n = nums.size(), l = 0, r = n - 1;
        for (int i = l; i <= r; ++i) {
            if (nums[i] == 0) 
                swap(nums[l++], nums[i--]);
            else if (nums[i] == 2) 
                swap(nums[r--], nums[i--]);
            if (i < l - 1) i = l - 1;
        }
    }
};

相關文章