leetcode 2024春招冲刺百题计划——动态规划+数论

不打算充钱

第一次用java写,有点不熟悉。。。还是用c+stl爽。

没写完,不定期更新。在忙八股,先发出来吧,万一有人需要呢

先更数论和动态规划

目录

动态规划篇

数论篇


动态规划篇

70. 爬楼梯

一眼斐波那契数列。想更进一步可以找一下矩阵写法。

class Solution {
    public int climbStairs(int n) {
        if(n==1) return 1;
        else if(n==2) return 2;
        int sum=0,f1=1,f2=2;
        for(int i=3;i<=n;i++){
            sum=f1+f2;
            f1=f2;
            f2=sum;
        }
        return sum;
    }
}

118. 杨辉三角

一眼数字三角形dp,入门dp,感觉不用多说。。。

这道题对我来说难在哪里了。。。难在,怎么转换为固定答案需要的格式了。。。。。。。我以前做算法题哪里受过这气,无论牛客洛谷还是cf不都直接打印输出就行。。。。。。让我用c++写分分钟,让我用java写,我还得回忆一下,java二维数组怎么转list来着。。。

思考了半天函数,最后还是选择了遍历,简单粗暴。

class Solution {
    public List> generate(int numRows) {
        int [][]array = new int[50][50];
        array[0][0] = 1;
        List> list = new ArrayList<>();
        List first = new ArrayList<>();
        first.add(1);
        list.add(first);
        for (int i=1;i row = new ArrayList<>();
            array[i][0]=1;
            row.add(1);
            for (int j=1;j

198. 打家劫舍

简单dp,稍微理一下思路就能看出来和第一道题没什么大差别。每个数要么从前一个数转移过来,自身不能选;要么从前两个数转移过来,能带上自身。

怎么想到的?我也不知道,但是dp做一部分后,看到这道题脑子里自动生成了答案。

class Solution {
    public int rob(int[] nums) {
        int n=nums.length;
        if (n==1) {
            return nums[0];
        }
        int []dp = new int[300];
        dp[0]=nums[0];
        dp[1]=nums[1];
        dp[1]=max(nums[0],nums[1]);
        for(int i=2;i=b) return a;
        else return b;
    }
}

329. 矩阵中的最长递增路径

能优化为dp,拓扑排序我确实没想到。

以后记一下这种题,还可以拓扑排序写。

我的思路是一眼dfs,但是数量太多,所以一定要优化。剪枝策略+记忆化搜索。

记忆化的难点在什么?在于你如何让每个结点记录他的新的值。和以往的回溯法不同,简单的回溯大多数情况下不需要额外记录当前结点状态。而记忆化搜索的难点(个人认为)在于如何记录当前结点状态。

因此在搜索的时候每次都当成一个新结点搜索,将当前的值保存下来即可。实现不难,但是想到比较难。。。

优化dp没看,但和记忆化思路应该差不多。

class Solution {
    //首先要知道只要搜过的路确认是这里,就不需要再搜了。从这里必然不可能是新的开始地方。
    //或者说每个地方可以自己标记自己的最大值,遇到时若有直接返回
    //而且比起dp,我更喜欢用dfs来看这道题
    int [][]mp = new int[250][250];
    private int m;
    private int n;
    public int longestIncreasingPath(int[][] matrix) {
        m = matrix.length;
        n = matrix[0].length;
        boolean [][]acc = new boolean[250][250];
        int mx=0;
        for (int i=0;i=m||ty<0||ty>=n) continue;
            if(matrix[tx][ty]<=matrix[x][y]) continue;
            cnt++;
            ans = max(ans,dfs(tx,ty,matrix,cnt)+1);
            cnt--;
        }
        mp[x][y]=ans;
        return ans;
    }
    public int max(int a,int b){
        if (a>b) return a;
        else return b;
    }
}

你可能感兴趣的:(leetcode,算法)