Leetcode刷题记录
寒假回家是时候刷题了,此贴用于记录每日刷题否,刷题数
(一些简单题与思路重复题就不记了)
- 1月11号
今天学习动态规划,其实昨天就开始学习了,不过回家第一天效率不太尽如人意,今天开始认真学习。
面试题17.16 按摩师
此题在力扣上是简单难度
先贴代码
`class Solution {
public int massage(int[] nums) {
//dp[i]以nums[i]结尾的所能得到的最大预约数
int n=nums.length;
if(n==0) return 0;
if(n==1) return nums[0];
int dp[]=new int[n];
dp[0]=nums[0];
dp[1]=Math.max(nums[0],nums[1]);
for(int i=2;i<n;i++){
dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
}
return dp[n-1];
}
}`
大概思想是:用dp[i]将以nums[i]为结尾的所能得到的最大预约数求出,这样每个dp[i]只需要考虑dp[i-2],dp[i-1]和nums[i]就好了
f(i)=f(i-2)+nums[i]||f(i-1)
内存消耗有点大哈,不过不着急,先做出来,优化日后再说
62 不同路径
class Solution {
public int uniquePaths(int m, int n) {
//dp[i,j]=dp[i-1,j]+dp[i,j-1]
if(m==0||n==0) return 0;
int i=0,j=0;
int dp[][]=new int[m][n];
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(i==0&&j==0){
dp[i][j]=1;
}
else if(i==0){
dp[i][j]=1;
}
else if(j==0){
dp[i][j]=1;
}
else{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}
1.13
1.14
剑指offer 13.机器人的运动范围
class Solution {
public int movingCount(int m, int n, int k) {
if(m==0||n==0) return 0;
int nums[][]=new int[m][n];
int res=0,sum=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
res=i/100+i%100/10+i%10+j/100+j%100/10+j%10;
if(i==0&&j==0) nums[i][j]=1;
else if(i==0){
if(res<=k) nums[i][j]=nums[i][j-1];
else nums[i][j]=0;
}
else if(j==0){
if(res<=k) nums[i][j]=nums[i-1][j];
else nums[i][j]=0;
}
else{
if(res<=k)
nums[i][j]=Math.max(nums[i-1][j],nums[i][j-1]);
else nums[i][j]=0;
}
sum+=nums[i][j];
}
}
return sum;
}
}
剑指offer 46 把数字翻译成字符串
class Solution {
public int translateNum(int num) {
//动态规划,把Int转变为数组,或者用栈?
String m=String.valueOf(num);
if(m.length()==0) return 0;
if(m.length()==1) return 1;
Stack<Integer> s=new Stack<>();
while(num>=100){
s.push(num%10);
num=num/10;
}
int temp=num;//十位数
s.push(num%10);
int dp[]=new int[m.length()];
dp[0]=1;dp[1]=temp>25?1:2;
int i=2,h1=s.pop(),h2=0,h=0;
while(!s.empty()){
h2=s.pop();
h=h1*10+h2;
dp[i]=h>25||h<10?dp[i-1]:(dp[i-2]+dp[i-1]);
i++;
h1=h2;
}
return dp[m.length()-1];
}
}
优化稍后再议
1.15
树啊树 树啊树 我喉咙里的鱼刺 我屁股下的针毡 我背后的利剑
这次一定要解决它!