198、你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 1:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。
dp[i] = max(dp[i-2] + nums[i], dp[i-1])
// dp[i]:到房间i时偷窃的最高金额
// 状态转移:1)偷窃第i个房间,2)不偷窃
// dp[i] = max(dp[i-2] + nums[i], dp[i-1])
vector<int> dp;
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() == 0) return 0;
else if(nums.size() == 1) return nums[0];
dp.resize(nums.size(), 0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
int ans = dp[1];
for(int i = 2; i < nums.size(); i++){
dp[i] = max(dp[i-2] + nums[i], dp[i-1]);
ans = max(ans, dp[i]);
}
return ans;
}
};
结果:
执行用时:0 ms, 在所有 C++ 提交中击败了100.00% 的用户
内存消耗:7.9 MB, 在所有 C++ 提交中击败了50.61% 的用户
303、给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
示例:
给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
dp[i] = dp[i-1] + nums[i];
// dp[i]:从0到i的和
// dp[i] = dp[i-1] + nums[i];
class NumArray {
public:
vector<int> dp;
NumArray(vector<int>& nums) {
if(nums.size() == 0) return;
dp.resize(nums.size(), 0);
dp[0] = nums[0];
for(int i = 1; i < nums.size(); i++)
dp[i] = dp[i-1] + nums[i];
}
int sumRange(int i, int j) {
if(i == 0) return dp[j];
else return dp[j] - dp[i-1];
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray* obj = new NumArray(nums);
* int param_1 = obj->sumRange(i,j);
*/
结果:
执行用时:60 ms, 在所有 C++ 提交中击败了40.09% 的用户
内存消耗:17.2 MB, 在所有 C++ 提交中击败了64.29% 的用户
392、给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
示例 1:
s = "abc", t = "ahbgdc"返回 true.
双指针
class Solution {
public:
bool isSubsequence(string s, string t) {
int i = 0, j =0; //i标记s,j标记t
for(; i < s.size() & j < t.size(); j++){
if(s[i] == t[j]) i++;
}
if(i == s.size()) return true;
else return false;
}
};
结果:
执行用时:0 ms, 在所有 C++ 提交中击败了100.00% 的用户
内存消耗:6.5 MB, 在所有 C++ 提交中击败了40.85% 的用户