刷题笔记:39 最少步数问题 | 豆包MarsCode AI刷题

71 阅读2分钟

今天分享一道我个人认为非常有意思的题目与思路分析:是题库中的“计算从x到y的最小步数”,虽然从难度系数上来说属于简单题,但其中我个人认为有一步思路非常巧妙。 首先,展示题目如下:

问题描述

小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。

输入描述

输入包含两个整数 x 和 y,表示起始位置和目标位置。

输出描述

输出从 x 到 y 所需的最小步数。

乍一看似乎不难,我的第一反应是用递归就可以解决,于是我设计了递归函数,作一系列判断去求出这一最少步数,但不仅代码繁琐,部分用例的测试也通过不了。 于是我停下手开始仔细斟酌题目,并且脑测了几个比较小的值,试图发现一些数学规律,结果我还真的找到了。 事实上这一最少步数所对的路径(我们称为最优路径)是一个步长对称的路径,也就是说其实最少步数和x、y距离之间存在着一个并不复杂的分段函数关系,我恍然大悟,于是就有了下面这段代码:

public class Main {
 
    
    public static int solution(int x, int y) {
      int t =Math.abs(x-y);
      int count=0;
      int a=1;
      if(t==0)return 0;
      if(t==1)return 1;
      else{
        while (t>0) {
            t-=a;
            count++;
            if (count%2==0)
            a++;
        }
        return count;
      }


    }

    public static void main(String[] args) {
        // You can add more test cases here
        System.out.println(solution(12, 6) == 4);
        System.out.println(solution(34, 45) == 6);
        System.out.println(solution(50, 30) == 8);
    }
}

非常简洁!只需要把步数从1开始慢慢累加,直到满足步长之和等于总的距离就可以了,比起冗长的递归,显然这一方法更佳。不过如果没有对简单情况进行分析的话,估计也想不到最佳路径的步长变化情况会是这么一个情形,因此我觉得在遇到一个陌生的算法题的时候,有时可以不从算法的角度去分析,而是先尝试发现一些数学上的规律,当你发现了数学上的一些规律之后,题目就变得无比简单易懂易解决了。