public class SanBu { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); System.out.println(waysToStep(n)); }
public static int waysToStep(int n) { int a=1; //一个台阶一种走法 1 int b=2; //二个台阶两种走法 1+1 / 2 int c=4; //三个台阶四种走法 1+1+1 / 1+2 / 2+1 / 3 int d=0; for(int i=1;i<n;i++){ d=(a+(b+c)%1000000007)%1000000007; a=b; b=c; c=d; } return a; }
}
结果
面试08.02 迷路的机器人
题目
分析
代码
1 2
结果
面试08.11 硬币
题目
分析
代码
1 2
结果
面试17.16 按摩师/打家劫舍(a[0]+a[2]和a[1]对比)
题目
分析
1. 思路:(当前+前两个) ?(前一个)
2. 第一种o(n):dp[i]=Math.max(dp[i-1],nums[i]+dp[i-2]);
3. 第二种o(1): a b c三个变量递进循环
public class AnMoShi { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=input.nextInt(); int[] a=new int[n]; for(int i=0;i<n;i++){ a[i]=input.nextInt(); } System.out.println(massage(a)); }
//O(n) public static int massage(int[] nums) { int n = nums.length; //数组长度 if (n == 0) { return 0; //如果数组长度为0就返回0 } if (n == 1) { return nums[0]; //如果只有一个就返回这个值 } int[] dp = new int[n]; //存放结果 dp[0] = nums[0]; //第一个值就是当前的第一个 dp[1]=Math.max(nums[0], nums[1]); //判断是1开始还是2开始 for(int i=2;i<n;i++){ dp[i]=Math.max(dp[i-1],nums[i]+dp[i-2]); }
return dp[n-1]; //返回最后一个值 }
//O(1) public int massage(int[] nums) { int a = 0, b = 0; for (int i = 0; i < nums.length; i++) { int c = Math.max(b, a + nums[i]); a = b; b = c; } return b; }