Leetcode笔记——贪心+DP

1. 跳跃游戏

2. 视频拼接

3. 剪绳子I

4. 把数字翻译成字符串

1. 跳跃游戏

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
--------------------------------------------------------------------------------
思路:遍历数组,维护一个max表示目前最远能跳到的位置
class Solution {
    public boolean canJump(int[] nums) {
        int max = 0;
        for(int i = 0; i< nums.length; i++){
            if(i > max)     return false;
            int temp = nums[i] +i;
            if(temp >= nums.length) return true;
            if( temp > max)    max = temp;
        }
        return true;    //如果出现[0]这种输入
    }
}

2. 视频拼接

输入:clips = [[0,2],[1,9],[1,5],[4,6],[5,9],[8,10]], T = 10
输出:3
解释:
我们选中 [0,2], [8,10], [1,9] 这三个片段。
然后,按下面的方案重制比赛片段:
将 [1,9] 再剪辑为 [1,2] + [2,8] + [8,9] 。
现在我们手上有 [0,2] + [2,8] + [8,10],而这些涵盖了整场比赛 [0, 10]。
-----------------------------------------------------------------------------
思路:dp[i]表示从i开始能到的最远的位置
该例子中dp[] = {2,9,0,0,6,9,0,0,10,0,0}
遍历数组,max记录下目前能到的最远的位置,pre记录上一个位置,ans记录答案
i = 0: max =2,pre = 0, 因为pre == i; ans++,表示需要[0,2]; pre = max,表示目前最远的是2
i = 1: max = 9,pre = 2,因为目前可以到2,现在i<2,先不急着ans++,万一存在[2,10],就不需要[1,9]了,继续观望,一直到pre == i,我们才做最后的打算

class Solution {
    public int videoStitching(int[][] clips, int T) {
        int[] dp = new int[T+1];
        int a,b;    //临时变量
        int temp;    //临时变量
        //下面都在计算dp
        for(int i = 0; i < clips.length; i++){
            a = clips[i][0];
            if(a > T)   continue;    
            b = clips[i][1];
            temp = b > T? T: b;
            dp[a] = Math.max(dp[a], temp);
        }
        
        int max = 0;
        int pre = 0;
        int ans = 0;
        for(int i =0; i< T+1; i++){
            max = Math.max(max,dp[i]);
            if(max == T)    return ans+1;
            if(pre == i){
                ans++;
                pre = max;
            }
            if(max == i)    return -1;
        }
        return ans;
    }
}

3. 剪绳子I

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
---------------------------------------------------------
思路:当n>=5的时候,剪成2或者3肯定比剪大的划算。
比如:n=13时,单独剪一个6出来,肯定不如2*2*2来的划算

class Solution {
    public int cuttingRope(int n) {
        int[] dp = new int[n+1];
        if(n == 2)    return 1;
        if(n == 3)      return 2;
        if(n == 4)      return 4;
        dp[2] = 2;
        dp[3] = 3;
        dp[4] = 4;
        int temp1, temp2;
        for(int i = 5; i<=n ; i++){
            temp1 = 3 * dp[i-3];
            temp2 = 2 * dp[i-2];
            dp[i] = temp1> temp2? temp1: temp2;
        }
        return dp[n];
    }
}

4. 把数字翻译成字符串

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
----------------------------------------------------
思路:dp[i]表示到第i个字符一共有多少种答案
以12258为例
初始化dp[0],dp[1]
dp[0] = 1;
dp[1] = 2; 因为 12<=25
当字符i和i-1大于等于10并且小于25,dp[i] = dp[i-1] +dp[i]
不然 dp[i] = dp[i-1]
class Solution {
    public int translateNum(int num) {
        if(num < 10)  return 1;
        int n = 0;
        int temp = num;
        while(temp > 0){
            temp = temp/10;
            n++;
        }
        int[] dp = new int[n];
        String str = String.valueOf(num);
        dp[0] = 1;
        int first = (str.charAt(0) - '0') * 10 + str.charAt(1) - '0';
        if(first <= 25)     dp[1] = 2;
        else    dp[1] = 1;
        for(int i =2; i<n; i++){
            int temp1 = (str.charAt(i-1) - '0') * 10 + str.charAt(i) - '0';
            //System.out.println("temp = "+ temp1);
            if(temp1 <= 25 && temp1 >= 10)  dp[i] = dp[i-1] + dp[i-2];
            else    dp[i] = dp[i-1];
        }
        //for(int num1: dp){
        //    System.out.println(num1);
        //}
        return dp[n-1];
        
    }
}

 

# 高校智慧校园解决方案摘要 智慧校园解决方案是针对高校信息化建设的核心工程,旨在通过物联网技术实现数字化校园的智能化升级。该方案通过融合计算机技术、网络通信技术、数据库技术和IC卡识别技术,初步实现了校园一卡通系统,进而通过人脸识别技术实现了更精准的校园安全管理、生活管理、教务管理和资源管理。 方案包括多个管理系统:智慧校园管理平台、一卡通卡务管理系统、一卡通人脸库管理平台、智能人脸识别消费管理系统、疫情防控管理系统、人脸识别无感识别管理系统、会议签到管理系统、人脸识别通道管理系统和图书馆对接管理系统。这些系统共同构成了智慧校园的信息化基础,通过统一数据库和操作平台,实现了数据共享和信息一致性。 智能人脸识别消费管理系统通过人脸识别终端,在无需接触的情况下快速完成消费支付过程,提升了校园服务效率。疫情防控管理系统利用热成像测温技术、视频智能分析等手段,实现了对校园人员体温监测和疫情信息实时上报,提高了校园公共卫生事件的预防和控制能力。 会议签到管理系统和人脸识别通道管理系统均基于人脸识别技术,实现了会议的快速签到和图书馆等场所的高效通行管理。与图书馆对接管理系统实现了一卡通系统与图书馆管理系统的无缝集成,提升了图书借阅的便捷性。 总体而言,该智慧校园解决方案通过集成的信息化管理系统,提升了校园管理的智能化水平,优化了校园生活体验,增强了校园安全,并提高了教学和科研的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值