前言
先附上前两篇文章,
[Leetcode Week1]Blind1~17、Weekly Contest 322
[Leetcode 前传] 个人背景、优质资源分享
这礼拜接近学期末,事情比较多所以拖到今天才发文,week2刷了Blind169(18~33),这礼拜的週赛我只解出一题,跟上週第二题一样,方向错了最后脑死,Hashmap的题目我也写了有五六题了,结果第二题还没没有想到,真的是小懊恼。
然后第一次週赛的成绩出来了,我不确定是因为第一次参赛所以修正到你应当的分数,还是每次的修正幅度都那么大(我以为起始分数是1600),下图是第一次週赛完之后(第二週在我发文这时候还没更新)
Blind169 18~33
Blind169题库整理里面是我写169的笔记以及code,有参考别人的我会附上别人的,每週的文,会挑个两三题来分享,其他的可以自己去里面翻。大神版看不懂可以看看小弟的脑弱版本。
338. Counting Bits
我发现我对Bit相关的题目跟二进位相关的题目比较没辄,所以来分享这题
题意说明
输入一个数字n,输出一个阵列含有1~n里的每个数字,二进位有几个1
Input: n = 5Output: [0,1,1,2,1,2]Explanation:0 --> 01 --> 12 --> 103 --> 114 --> 1005 --> 101
程式码及说明
这题我参考了[LeetCode] Counting Bits 计数位
0 0000 0-------------1 0001 1-------------2 0010 13 0011 2-------------4 0100 15 0101 26 0110 27 0111 3-------------8 1000 19 1001 210 1010 211 1011 312 1100 213 1101 314 1110 315 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 43 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上之后
就把最后一行删掉
循环到没有行数为止