目錄
- 2024-03-08 leetcode寫題記錄
- 27. 移除元素
- 題目連結
- 題意
- 解法
- 179. 最大數
- 題目連結
- 題意
- 解法
- 75. 顏色分類
- 題目連結
- 題意
- 解法
- 27. 移除元素
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. 顏色分類
題目連結
- 顏色分類
題意
給定一個包含紅色、白色和藍色、共\(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;
}
}
};