leetCode 动态规划2

338. 比特位计数

//枚举的话  nlogn的

//n 的话 :
//用之前计算的结果

//f[n]:  f[n/2]算过了  
//f[n] = f[n/2] + 1(奇数时候加一)

class Solution {
    public int[] countBits(int num) {
        if (num == 0)
            return null;
        int[] dp = new int[num + 1];
        dp[0] = 0;
        for(int i = 1; i <= num; i++){
            dp[i] = dp[i>>1] + (i & 1);//如果i是奇数时候, 加上1
        }
        return dp;
    }
}

322. 零钱

class Solution {
    public int coinChange(int[] coins, int amount) {

        int [] f = new int[amount + 1];
        f[0] = 0;

        for(int i = 1; i <= amount; i++){

            int cost = Integer.MAX_VALUE;   //此目标值下的  硬币个数  //cost用于存储每个目标值的dp[i]

            for(int j = 0; j < coins.length; j++){
                if(i - coins[j] >= 0){  //如果能填这个硬币
                    if(f[i-coins[j]] != Integer.MAX_VALUE) // 如果上一个存在           
                        cost = Math.min(cost, f[i - coins[j]] + 1);
                }
            }  

            f[i] = cost;     //赋值
        }

        return  f[amount] == Integer.MAX_VALUE? -1 : f[amount];
    }
}

221. 最大正方形

class Solution {
    public int maximalSquare(char[][] matrix) {
        if (matrix == null || matrix.length <= 0 ||matrix[0] == null || matrix[0].length <= 0)
            return 0;
        int n = matrix.length, m = matrix[0].length;
        int[][] dp = new int[n][m];              //dp中存放最大边长
        int res = 0;
        //dp[0][0] = Integer.valueOf(matrix[0][0]);
        for (int i = 0; i < n ; i++){
            for (int j = 0; j < m; j++){
                if (matrix[i][j] == '0')
                    dp[i][j] = 0;
                else{
                    dp[i][j] = 1;
                    if (i >= 1 && j >= 1)
                        dp[i][j] += Math.min(dp[i - 1][j], Math.min(dp[i - 1][j - 1], dp[i][j - 1]));   //边长取最小+1
                    res = Math.max(res, dp[i][j]);
                }
            }
        }
        
        return res * res;
    }
}

91. 解码方法

// f[i]: 截至第i位有多少

// f[i] = 1. f[i]  可否表示(>0) :f[i] += f[i -1]
//2. f[i]和f[i-1]可否表示(10-26) : f[i] += f[i -2]

class Solution {
    public int numDecodings(String s) {
        if (s == null || s.length() <= 0)
            return 0;
        int len = s.length();
        int[] dp = new int[len + 1];
        s = ' ' + s;
        dp[0] = 1;  //第一个位置的前面,初始化位一
        for (int i = 1; i <= len; i++){
            dp[i] = 0;
            if (s.charAt(i) != '0')
                dp[i] += dp[i - 1];  //自己单独一位
            if(i > 1){
                int t = (s.charAt(i - 1) - '0') *10 + (s.charAt(i) - '0');  //得数字
                if (t >= 10 && t <= 26)
                    dp[i] += dp[i - 2];
            }
        }
        return dp[len];
    }
}

263. 丑数

class Solution {
    public int nthUglyNumber(int n) {
        ArrayList<Integer> q = new ArrayList<Integer>();
        q.add(1);
        int i = 0, j = 0, k = 0;
        while (--n >0){
            int t = Math.min(q.get(i)*2,Math.min(q.get(j)*3, q.get(k)*5));
            q.add(t);
      
            if (q.get(i) * 2 == t) i++;
            if (q.get(j) * 3 == t) j++;
            if (q.get(k) * 5 == t) k++;
        }
        return q.get(q.size() - 1);
    }
}

115. 不同的子序列

class Solution {
    //相同: f[i][j] = f[i -1][j - 1] + (不用)f[i -1][j];
    //不相同:f[i][j] = f[i -1][j];
    public int numDistinct(String s, String t) {
        if (s == null || t == null)
            return 0;
        int n = s.length(), m = t.length();
        int[][] dp = new int[n+1][m+1];
        for (int i = 0; i <= n; i++)  //初始化边界
            dp[i][0] = 1; //全不匹配
        
        for(int i = 1; i<=n; i++){
            for (int j = 1; j <=m; j++){
                dp[i][j] = dp[i - 1][j];
                if (s.charAt(i - 1) == t.charAt(j -1))
                    dp[i][j] += dp[i-1][j-1];
            }
        }
        
        return dp[n][m];
    }
}

全部评论

相关推荐

昨天 12:26
已编辑
中南大学 PHP
点赞 评论 收藏
分享
双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
03-04 19:02
云南大学 Java
Yki_:没挂,只是没人捞,该干啥干啥,等着就好了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务