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] 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;
}
}