【leetcode】dp---简单(1)198. 打家劫舍_dp类楼梯(2)303. 区域和检索_dp序列_可变范围和(3)392. 判断子序列_双指针

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% 的用户

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值