20200312
题目 :礼物的最大价值
在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
思路 : dp 转移方程:
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;
}
}