摘要:
暴力做法是,枚举从m~n的所有数,因为题目说了数据最大为2147483647,所以可以枚举0~30位,对所有数字的每一位做与运算。 数据比较大的时候这样做会超时(时间复杂度是O(n))。 参考官方题解,有一个简单得多的做法。 观察发现,要对所有数做按位与,只要有一个数的某一位为0,则最后按位与的结果 阅读全文
posted @ 2020-08-04 17:25
machine_gun_lin
阅读(158)
评论(0)
推荐(0)
摘要:
非常经典的搜索问题。遍历数组,从每一个1开始深度优先搜索当前位置联通的位置是否都是1(也就是与它联通的陆地),用一个额外的布尔数组visited记录每一个位置的元素是否已经访问过,每个遍历过的位置visited都标记为true。 代码如下: class Solution { public: vect 阅读全文
posted @ 2020-08-04 16:46
machine_gun_lin
阅读(81)
评论(0)
推荐(0)
摘要:
二叉树层次遍历,用一个数组记录每一层的最右边的元素。 class Solution { public: vector<int> rightSideView(TreeNode* root) { if(root == NULL) { return {}; } vector<int> res; queue 阅读全文
posted @ 2020-08-04 16:16
machine_gun_lin
阅读(75)
评论(0)
推荐(0)
摘要:
用dp[i]表示打劫到第i个房子(i从0开始)时能获取到的最高金额,显然对于第i个房子,我们有打劫和不打劫两种方案。 如果不打劫第i个房子,那么到第i个房子能获取的最高金额和到第i - 1个房子能获取到的最高金额是一样的(因为到了第i个房子这里没有收入嘛)。因此我们有dp[i] = dp[i - 1 阅读全文
posted @ 2020-08-04 16:04
machine_gun_lin
阅读(69)
评论(0)
推荐(0)
摘要:
循环,逐位判断每一位是不是1。 class Solution { public: int hammingWeight(uint32_t n) { int res = 0; for(int i = 0; i < 32; ++i) { res += (n >> i & 1) == 1 ? 1 : 0; 阅读全文
posted @ 2020-08-04 15:48
machine_gun_lin
阅读(41)
评论(0)
推荐(0)
摘要:
颠倒一个32位无符号整数的二进制位,因为它只有32位,所以我们可以用一个循环,从最低位开始获取它的当前位的数字,然后循环32次把数字加到一个新的32位无符号整数上,然后返回这个32位无符号整数就ok。 对于数字n,要获取最低位的数字就是 n & 1,也可以理解为n >> 0 & 1,意思就是n的二进 阅读全文
posted @ 2020-08-04 15:42
machine_gun_lin
阅读(69)
评论(0)
推荐(0)
摘要:
要右移k次,且只能用O(1)的空间,最简单的办法是循环k次,每次用一个变量temp记录最后一个位置的值,然后让最后一个下标(下标从0开始)到下标1的值都为前一个元素的值,再让下标0的值为temp。 这样进行k次之后,就完成了循环右移k次。 不过这样会超时,一个较简单的做法是,对于右移到数组前边的k个 阅读全文
posted @ 2020-08-04 15:28
machine_gun_lin
阅读(63)
评论(0)
推荐(0)