iT邦幫忙

0

[Leetcode Week 2]Blind 18~33、Weekly Contest 323

  • 分享至 

  • xImage
  •  

前言

先附上前兩篇文章,
[Leetcode Week1]Blind1~17、Weekly Contest 322
[Leetcode 前傳] 個人背景、優質資源分享
這禮拜接近學期末,事情比較多所以拖到今天才發文,week2刷了Blind169(18~33),這禮拜的週賽我只解出一題,跟上週第二題一樣,方向錯了最後腦死,Hashmap的題目我也寫了有五六題了,結果第二題還沒沒有想到,真的是小懊惱。
然後第一次週賽的成績出來了,我不確定是因為第一次參賽所以修正到你應當的分數,還是每次的修正幅度都那麼大(我以為起始分數是1600),下圖是第一次週賽完之後(第二週在我發文這時候還沒更新)
leetcode分數

Blind169 18~33

Blind169題庫整理裡面是我寫169的筆記以及code,有參考別人的我會附上別人的,每週的文,會挑個兩三題來分享,其他的可以自己去裡面翻。大神版看不懂可以看看小弟的腦弱版本。

338. Counting Bits

我發現我對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的個數比較好?(不知道)

Contest323

第一題 2500. Delete Greatest Value in Each Row

題意說明

每次刪除每列的最大值,像題目給的

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上之後
就把最後一行刪掉
循環到沒有行數為止


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言