新手算法学习之路----二分法
这是我的第一个算法题目,希望通过此方法来要求自己努力进步。
题目 :二分法的实现
前提条件:带操作的数组为一个有序的数组。
基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置midlle开始比较,
如果当前位置array[midlle]值等于key,则查找成功;
若key小于当前位置值array[midlle],则在数列的前半段中查找,array[start,midlle];
若key大于当前位置值array[midlle],则在数列的后半段中继续查找array[midlle,end],
直到找到为止,时间复杂度:O(log(n))。
时间复杂度: 假设该数组的长度是N那么二分后是N/2,再二分后是N/4……直到二分到1结束(当然这是属于最坏的情况了,即每次找到的那个中点数都不是我们要找的),那么二分的次数就是基本语句执行的次数,于是我们可以设次数为x,N*(1/2)^x=1;则x=logn,底数是2
Java主要代码:
public int binarySearch(int[] nums, int target) { //write your code here if (nums == null || nums.length == 0) { return -1; } int start = 0, end = nums.length - 1; while (start < end-1) { int mid = start + (end - start) / 2; if (nums[mid] == target) { end = mid; } else if (nums[mid] < target) { start = mid; } else { end = mid; } } if (nums[start] == target) { return start; }else if(nums[end]==target){ return end; }else return -1; }
遇到的问题:1,分不清到底该怎么while语句里面进行判断。
2,刚开始没有设置一个flag, 该found作用是判断已经找到了目标数,而start与end的比较是为了判断是否已经搜索了所有的数据。