在一根无限长的数轴上,你站在0的位置。终点在target的位置。
你可以做一些数量的移动 numMoves :
每次你可以选择向左或向右移动。
第 i 次移动(从 i == 1 开始,到 i == numMoves ),在选择的方向上走 i 步。
给定整数 target ,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。示例 1:
输入: target = 2
输出: 3
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 -1 。
第三次移动,从 -1 到 2 。
示例 2:输入: target = 3
输出: 2
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 3 。
提示:
-109 <= target <= 109
target != 0来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reach-a-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题刚开始看以为是动态规划问题,后来发现想多了根本不满足动态规划的解决思路,我们刨析一下这个问题即可发现它采用的数学思维的变迁,主要分为3部分变化,看一下我画的分析图即可明白,其实这个题还是有意思的不枉是一个中等题
- int reachNumber(int target){
- int n=fabs(target);
- int k=0,num=0;
- while(num
- {
- k++;
- num+=k;
- }
- printf("%d %d",k,num);
- if(num==n) //1,相等肯定不变了
- {
- return k;
- }
- if(num-k==n) //3
- {
- return k-1;
- }
- if((num-n)%2==0) //1,相差偶数也不用变
- {
- return k;
- }
- if(num+(k+1)-n<=2*k&&k%2==0) //4实现顺序不能乱
- {
- return k+1;
- }
- if((num-n)%2==1) //2
- {
- return k+2;
- }
- return 0;
- }
跌了几次坑,所以就....................