剑指offer-20200312

20200312

题目 :礼物的最大价值

在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

思路 : dp 转移方程: f ( i , j ) = m a x [ f ( i 1 , j ) , f ( i , j 1 ) ] + g r i d [ i ] [ j ] f(i,j) = max[f(i-1,j),f(i,j-1)] + grid[i][j]

class Solution{
    public int maxValue(int[][] grid){
        if(grid == null || grid.length == 0 || grid[0].length == 0){
            return 0;
        }
        int rows = grid.length;
        int cols = grid[0].length;
        int[][] dp = new int[row][cols];
        for(int i =0;i<rows;i++){
            for(int j=0;i<cols;j++){
                if(i == 0 && j == 0){
                    dp[i][j] = grid[0][0];
                }else if(i == 0){
                    dp[i][j] = dp[i][j-1] + grid[i][j];
                }esle if(j == 0){
                    dp[i][j] = dp[i-1][j] + grid[i][j];
                }else{
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]) + grid[i][j];
                }
                
            }
        }
        return dp[rows-1][cols - 1];
    }
}

题目 :最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

思路 :滑动窗口,用set维护一个不重复的窗口

class Solution{
    public int lengthOfLongestSubstring(String s){
        int res = 0;
        Set<Character> set = new HashSet<>();
        for(int l = 0, r = 0;r < s.length(); r++){
            char c = s.charAt(r);
            while(set.contains(c)){
                set.remove(s.charAt(l++));
            }
            set.add(c);
            res = Math.max(res.r-l+1);
        }
        return res;
    }
}
发布了94 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_31900497/article/details/104812707