• 【Leetcode每日一题:754.到达终点的数字~~~数学分析+奇偶性判断+二分查找】


    题目描述

    在一根无限长的数轴上,你站在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

    解题思路提示

    1. 思路1:通过数学分析+观察奇偶性来解决。
    2. 思路2:通过二分查找+奇偶性判断来解决。

    实现代码

    实现代码1:
    class Solution {
        public int reachNumber(int target) {
            target=Math.abs(target);
            int sum=0;
            for(int i=1;i<=0x3f3f3f3f;++i){
                sum+=i;
                if(sum>=target&&(sum%2==target%2)){
                    return i;
                }
            }
            return 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    实现代码2:
    class Solution {
    	public int reachNumber(int target) {
    	        target=Math.abs(target);
    	        int sum=0;
    	        for(int i=1;;i++){
    	            sum+=i;
    	            if(sum>=target){
    	                int d=sum-target;
    	                //如果此时d的距离为偶数,符合题意,直接返回步数
    	                if(d%2==0){return i;}
    	                //再向后走i步,然后判断结果
    	                return (sum+i-target)%2==1?i+1:i+2;
    	            }
    	        }
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    实现代码3:
    class Solution {
        public int reachNumber(int target) {
            target = Math.abs(target);
            int low = 1, high = target;
            while (low < high) {
            	//二分最少步数
                int mid = low + (high - low) / 2;
                //求到达的位置
                long maxPos = (long) mid * (mid + 1) / 2;
                //边界判断
                if (maxPos >= target) {
                    high = mid;
                } else {
                    low = mid + 1;
                }
            }
            long d=(long)low * (low + 1)/2-target;
            if(d%2==0){return low;}
            return (d+target+low-target)%2==1?low+1:low+2;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行结果

    在这里插入图片描述

  • 相关阅读:
    【006身高绝对值排序(C++)】
    必知必会的22种设计模式(GO语言)
    20.(arcgis api for js篇)arcgis api for js面采集(SketchViewModel)
    Django ORM:最全面的数据库处理指南
    5.软件测试-----自动化测试
    【牛客网-前端笔试题】——Javascript专项练习6
    2.23作业
    算法设计与分析 SCAU19180 集合划分问题
    正则表达式--文本处理神器
    OAK相机:自动或手动设置相机参数
  • 原文地址:https://blog.csdn.net/Coder_ljw/article/details/127682560