目录
Leetcode213 打家劫舍
解题思路:
在不构成环的情况下,状态转移方程为:
环状排列意味着 第一个房子和最后一个房子只能选择一个偷窃,因此可以把此环状排列问题约化为两个单排排列房间子问题
- 1. 在不偷窃第一个房子的情况下(即),最大金额是
- 2. 在不偷窃最后一个房子的情况下(l即),最大金额是
综合偷窃最大金额:以上两种情况的较大值,即()
代码如下
class Solution {
public int rob(int[] nums) {
if(nums == null || nums.length == 0){
return 0;
}
if(nums.length == 1){
return nums[0];
}
if(nums.length == 2){
return Math.max(nums[0], nums[1]);
}
int res1 = myRob(Arrays.copyOfRange(nums, 0, nums.length - 1));
int res2 = myRob(Arrays.copyOfRange(nums, 1, nums.length));
return Math.max(res1, res2);
}
public int myRob(int[] nums){
int pre = 0;
int cur = 0;
for(int num : nums){
int tmp = cur;
cur = Math.max(pre + num, cur);
pre = tmp;
}
return cur;
}
}
LeetCode201数字范围按位与
解题思路
例如m = 9 n = 11
先对范围内的每个数字用二进制的字符串表示,例如9 = 00001001,然后将每个二进制字符串的位置对齐
得出所有数字按位与运算的结果是所有二进制字符串的公共前缀再用零补上后面的剩余位。证明如下:
假设对所有的这些二进制,前位均相同,第位开始不同,因为连续,所以第在的数字范围从小到大列举出来一定是前面全部是0,后面全部是1,上图中对应的[9,11]全是0,[12,12]全是1.并且一定存在连续的两个数和,满足的第位为0,后面全为1,的第位为1,后面全为0。对应上图中的例子11和12.这种形如0111...和1000...的二进制的按位与的结果一定为0000...,因此第位开始的剩余均为0,前位因为都相同,按位与结果也保持不变。最后的答案为二进制字符串的公共前缀再用零补上后面的剩余位。如何求呢?采用位移操作。
将两个数字不断向右移动,直到数字相等,即数字被压缩减为它们的公共前缀。然后通过将公共前缀向左移动,将零添加到公共前缀的右边以获得最终结果。
代码如下
class Solution {
public int rangeBitwiseAnd(int m, int n) {
int shift = 0;
while(m < n){
m >>= 1;
n >>= 1;
shift ++;
}
return m << shift;
}
}