二分查找

二分查找

http://www.nowcoder.com/questionTerminal/4f470d1d3b734f8aaf2afb014185b395

思路

普通的二分法查找,需要注意题目要求从左到右,返回第一个为target的下标

代码*(JAVA)

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 如果目标值存在返回下标,否则返回 -1
     * @param nums int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] nums, int target) {
        int low = 0;
        int high = nums.length-1;
        int mid = 0;
        while(low <= high){
            mid = low+ (high- low) / 2;
            if(nums[mid] == target){
                while(mid != 0 &&(nums[mid-1] == nums[mid])){
                    mid--;
                }
                return mid;
            }
            else if(nums[mid] > target){
                high = mid - 1;
            }
            else {
                low = mid + 1;
            }
        }
        return -1;
    }
}
全部评论
while(mid != 0 &&(nums[mid-1] == nums[mid])){ mid--; } 严格来说这步不算二分了吧,最差要走完半条数组
2 回复 分享
发布于 2021-05-19 00:31
这个说二分有点牵强了,最差情况就像评论里讲的,会退化成O(n)的复杂度,贴一个自己的代码供大家参考 int search(vector<int>& nums, int target) { int n=nums.size(); if(n==0)return -1; int left=0,right=n,mid; while(left</int>
点赞 回复 分享
发布于 2021-08-14 10:58
busuan
点赞 回复 分享
发布于 2021-07-24 19:02

相关推荐

rndguy:个人思路,抛砖引玉。 要我的话我先问清楚需求:要什么精度,什么速度,什么环境。 如果精度要求很低,平台也有点柔性的话,只需要输出pwm,然后开个中断记录各多少个脉冲,如果脉冲时间不对齐了就反馈控制电流加减就行。要求同步要求稍微高点的话可以在脉冲间做个线性插值,同步精度会高些。 但总体来说,如果直流有刷只有脉冲没有好的编码器的话很难做精准定位什么的(除非用一些电机磁路结构相关的奇技淫巧如高频注入什么的),所以要求更高就需要大量参数辨识和校准,那就慢多了。
点赞 评论 收藏
分享
评论
41
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务