先附上前兩篇文章,
[Leetcode Week1]Blind1~17、Weekly Contest 322
[Leetcode 前傳] 個人背景、優質資源分享
這禮拜接近學期末,事情比較多所以拖到今天才發文,week2刷了Blind169(18~33),這禮拜的週賽我只解出一題,跟上週第二題一樣,方向錯了最後腦死,Hashmap的題目我也寫了有五六題了,結果第二題還沒沒有想到,真的是小懊惱。
然後第一次週賽的成績出來了,我不確定是因為第一次參賽所以修正到你應當的分數,還是每次的修正幅度都那麼大(我以為起始分數是1600),下圖是第一次週賽完之後(第二週在我發文這時候還沒更新)
Blind169題庫整理裡面是我寫169的筆記以及code,有參考別人的我會附上別人的,每週的文,會挑個兩三題來分享,其他的可以自己去裡面翻。大神版看不懂可以看看小弟的腦弱版本。
我發現我對Bit相關的題目跟二進位相關的題目比較沒輒,所以來分享這題
輸入一個數字n,輸出一個陣列含有1~n裡的每個數字,二進位有幾個1
Input: n = 5
Output: [0,1,1,2,1,2]
Explanation:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
這題我參考了[LeetCode] Counting Bits 计数位
0 0000 0
-------------
1 0001 1
-------------
2 0010 1
3 0011 2
-------------
4 0100 1
5 0101 2
6 0110 2
7 0111 3
-------------
8 1000 1
9 1001 2
10 1010 2
11 1011 3
12 1100 2
13 1101 3
14 1110 3
15 1111 4
由上數列可以看到,最右邊那數字是一的個數,如果數字除以2是偶數,那他就會和除出來的數字的1個數一樣,如果除出來是奇數,那則剛好會是除出來的數加一。
比如:14/2 = 7,那14的1個數就會等於7的1個數
15/2 = 7.5(整數為7),那15的7的個數就會是7的1個數再加一
class Solution {
public:
vector<int> countBits(int n) {
vector<int> res;
res.push_back(0);
for(int i = 1; i <= n; i++) {
if (i % 2 == 0) {
res.push_back(res[i / 2]);
}else {
res.push_back(res[i / 2] + 1);
}
}
return res;
}
};
我覺得這種做法都有點技巧性,感覺像我剛開始學習,我先轉成2進位,再去算1的個數比較好?(不知道)
每次刪除每列的最大值,像題目給的
1 2 4
3 3 1
就是第一次刪除第一列的4,以及第二列的3,取出4 (4 > 3)
1 2
3 1
就是第二次刪除第一列的2,以及第二列的3,取出3 (3 > 2)
1
1
就是第二次刪除第一列的1,以及第二列的1,取出1 (1 = 1)
並且刪除的數字找出最大值,並加總起來
class Solution {
public:
int deleteGreatestValue(vector<vector<int>>& grid) {
int row_size = grid.size();
int res = 0;
//對每一列排序
for (int i = 0; i < row_size; i++) {
sort(grid[i].begin(), grid[i].end());
}
while(!grid[0].empty()) {
//比較找出最後一行最大值
int max = INT_MIN;
for (int i = 0; i < row_size; i++) {
if (grid[i].back() > max) {
max = grid[i].back();
}
}
res += max;
//刪除最後一行
for (int i = 0; i < row_size; i++) {
grid[i].pop_back();
}
}
return res;
}
};
};
暴力法:
我先對每一列排序,這樣我只要取出最後一個數字就是最大值
之後就比較最後一行的最大值,每當我拿到並加到res上之後
就把最後一行刪掉
循環到沒有行數為止