首页 > 其他分享 >LeetCode三则

LeetCode三则

时间:2024-04-17 23:12:30浏览次数:29  
标签:三则 下标 偷窃 nums int Solution 台阶 LeetCode

198. 打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。
每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统
如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:
输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:
1 <= nums.length <= 100
0 <= nums[i] <= 400
package y24m04d16.solution198;

public class Solution {
    public int rob(int[] nums) {
        int[] dp = new int[nums.length];
        //表示路过i房子时的最大收益
        if (nums.length == 1)return nums[0];
        //没得选
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        //二选一
        if (nums.length == 2)
            return dp[1];
        //要在i房子选择偷窃需满足:
        //在i-1房的收益>在i-2房的总收益+i房的收益
        for (int i = 2; i < nums.length; i++) {
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[nums.length - 1];
    }
}
Solution
509. 斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。

示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
public class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.fib(10));
    }

    /**
     * @author XiSoil
     * @date 2024/04/16 11:06
     *执行分布用时0ms,击败的100.00%Java用户
     *消耗内存分布39.38MB,击败的42.29%Java用户
     **/
    public int fib(int n) {
        int[] f = {0, 1, 0};
        if (n <= 1) return f[n];
        for (int i = 2; i <= n; i++) {
            f[2] = f[0] + f[1];
            //System.out.println(f[0] + " " + f[1] + " "+ f[2]);
            f[0] = f[1];
            f[1] = f[2];
        }
        return f[2];
    }
}
Solution
746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。
public class Solution {
    public static void main(String[] args) {
        int[] cost = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
        System.out.println(new Solution().minCostClimbingStairs(cost));
    }

    /**
     * @author XiSoil
     * @date 2024/04/16 11:34
     * 执行分布用时0ms,击败的100.00%Java用户
     * 消耗内存分布41.99MB,击败的90.00%Java用户
     **/
    public int minCostClimbingStairs(int[] cost) {
        int[] minCost = new int[cost.length+1];
        minCost[0] = 0;
        minCost[1] = 0;
        for(int i=2; i<=cost.length; i++){
            minCost[i] = Math.min(minCost[i-1]+cost[i-1], minCost[i-2]+cost[i-2]);
        }
        return minCost[cost.length];

//        优化-通过滚动数组的思想将空间复杂度优化到O(1)
/*        int left = 0;
        int right = 0;
        int minCost = 0;
        for(int i=2; i<=cost.length; i++){
            minCost = Math.min(right+cost[i-1], left+cost[i-2]);
            left = right;
            right = minCost;
        }
        return minCost;*/
    }
}
Solution

三道题的思想都是典型的动态规划

标签:三则,下标,偷窃,nums,int,Solution,台阶,LeetCode
From: https://www.cnblogs.com/xxaxf/p/18142027

相关文章

  • LeetCode两则
    1137.第N个泰波那契数泰波那契序列Tn定义如下:T0=0,T1=1,T2=1,且在n>=0的条件下Tn+3=Tn+Tn+1+Tn+2给你整数n,请返回第n个泰波那契数Tn的值。示例1:输入:n=4输出:4解释:T_3=0+1+1=2T_4=1+1+2=4示例2:输入:n=25输出:1389537提示:0<=n......
  • LeetCode 面试经典150题---007
    ####13.罗马数字转整数罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C100D500M1000例如,罗马数字2写做II,即为两个并列的1。12写做X......
  • LeetCode 1315. Sum of Nodes with Even-Valued Grandparent
    原题链接在这里:https://leetcode.com/problems/sum-of-nodes-with-even-valued-grandparent/description/题目:Giventhe root ofabinarytree,return thesumofvaluesofnodeswithan even-valuedgrandparent.Iftherearenonodeswithan even-valuedgrandpar......
  • LeetCode三则
    53.最大子数组和给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。示例2:输入:nums=[1]输出:1示例3:输......
  • leetcode插件问题
    1.使用一段时间后,提交答案一直返回undefind原因为插件缓存token有效期已过,需要重新登录2.重新登录......
  • 2321. 拼接数组的最大分数(leetcode)
    https://leetcode.cn/problems/maximum-score-of-spliced-array/description/这一题应该算一个连续最大子数组思维题,要点是根据差数组去做,然后求最值classSolution{public:intmaximumsSplicedArray(vector<int>&nums1,vector<int>&nums2){//f[i]表示以......
  • LeetCode 面试经典150题---006
    玩了一天多,两天没写了,下次绝对不摆了(最多摆一天)。####42.接雨水给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。n==height.length1<=n<=2*1040<=height[i]<=105不用头想都知道这个题肯定只能用线性复杂度做,至于怎......
  • LeetCode三则
    1.给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例2:输入:nums1=[1,2],nums2=[3,......
  • LeetCode四则
    1.给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],targ......
  • 最长递增子序列leetcode的总结
    使用动态规划解决,首先明白dp数组的含义dp[i]表示在位置i时最长的递增子序列dp[i]=max(dp[j]+1,dp[i])为递推公式初始化dp[i]=1都初始化为1因为最基本的每一个位置至少为一个遍历顺序for(inti=2;i<len;i++){            for(intj=0;j<i;j++){if(n......