本文介绍: 求从坐标零点到坐标点n的最小步数,一次只能沿横坐标轴向左或向右移动2或3.注意:途径的坐标点可以为负数坐标点n输出从坐标零点移动到坐标点n的最小步数42从坐标零点移动到4,最小需要两步,即右移2,再右移2。
题目
求从坐标零点到坐标点n的最小步数,一次只能沿横坐标轴向左或向右移动2或3.
注意:途径的坐标点可以为负数
输入描述
坐标点n
输出描述
输出从坐标零点移动到坐标点n的最小步数
备注
1<= n <= 10^9
示例1:
输入
4
输出
2
说明
从坐标零点移动到4,最小需要两步,即右移2,再右移2
思路
两种方案:
1. 动态规划
n=1,至少需要两步:3 -2
n=2, 只需移动一步:2
n=3, 只需移动1步:3
记dp[n]为n的最小步数
那么对于n>=4时,dp[n]=min(dp[n-3],dp[n-2])+1。
可以用一个队列来模拟实现这个过程
2. 数学
要想步数最小,考虑优先走3步,对于任意大于1的正整数n:记a=n/3;b=a%3
如果b == 0,那么只需要走a步即可(即全走3步)
如果b == 2,那么只需要走a+1步(a个3步,1个2步)
如果b == 1,那么需要走a-1+2=a+1步,(a-1个3步,2个2步)
题解
package hwod;
import java.util.LinkedList;
import java.util.Scanner;
public class TheMinStep {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(minStep(n));
}
//动态规划
private static int minStep(int n) {
if (n == 1) return 2;
LinkedList<Integer> queue = new LinkedList<>();
queue.addLast(2);
queue.addLast(1);
queue.addLast(1);
for (int i = 4; i <= n; i++) {
int first = queue.pollFirst();
int second = queue.peekFirst();
queue.addLast(Math.min(first, second) + 1);
}
return queue.peekLast();
}
// 数学解法
private static int minStep2(int n) {
if (n == 1) return 2;
int a = n / 3, b = n % 3;
if (b == 0) return a;
return a + 1;
}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。
原文地址:https://blog.csdn.net/qq_31076523/article/details/134699422
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_44864.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。