标签:二分 end target int Lintcode mid start 查找 数组
14 · 二分查找 算法 简单 通过率39% 题目 题解 笔记 讨论 排名 描述给定一个排序的整数数组(升序)和一个要查找的整数 target
,用O(logn)O(logn)的时间查找到target
第一次出现的下标(从0
开始),如果target
不存在于数组中,返回-1
。
样例 1:
输入:
数组 = [1,4,4,5,7,7,8,9,9,10]
target = 1
输出:
0
解释:
第一次出现在第0个位置。
样例 2:
输入:
数组 = [1, 2, 3, 3, 4, 5, 10]
target = 3
输出:
2
解释:
第一次出现在第2个位置
样例 3:
输入:
数组 = [1, 2, 3, 3, 4, 5, 10]
target = 6
输出:
-1
解释:
没有出现过6, 返回-1
挑战如果数组中的整数个数超过了2^{32}232,你的算法是否会出错?
题解:
mid是 start 和 end中间的数字
让start 和 end保持2个数字或以上的间隔
如果mid的值和target相等, 那么mid的值赋给end, 让循环继续
直至start和end的间距小于等于2, 那么就可以直接锁定数据的范围
target的位置就是start 或者 end, 或者不存在 返回-1
package lint;
import org.junit.Assert;
import org.junit.Test;
public class BinarySearch2 {
public int binarySearch(int[] nums, int target) {
int start = 0;
int end = nums.length-1;
int mid = -1;
while(start+1<end){
mid = start + (end-start)/2;
System.out.println("in while : mid:"+mid+ ", start:"+start + ", end:"+end);
if(nums[mid]>=target){
end = mid;
}else if(nums[mid]<target){
start = mid;
}
}
System.out.println("out while : mid:"+mid+ ", start:"+start + ", end:"+end);
if(nums[start]==target){
return start;
}else if(nums[end]==target){
return end;
}
return -1;
}
@Test
public void test1() {
Assert.assertEquals(3, new BinarySearch2().binarySearch(new int[]{3,4,5,8,8,8,8,10,13,14}, 8));
}
@Test
public void test2() {
Assert.assertEquals(2, new BinarySearch2().binarySearch(new int[]{1, 2 ,3, 4}, 3));
}
@Test
public void test3(){
Assert.assertEquals(3, new BinarySearch2().binarySearch(new int[]{1, 2 ,3, 4}, 4));
}
@Test
public void test4(){
Assert.assertEquals(3, new BinarySearch2().binarySearch(new int[]{1, 2 ,3, 4,4, 4, 5}, 4));
}
}
标签:二分,end,target,int,Lintcode,mid,start,查找,数组 来源: https://www.cnblogs.com/appinn/p/16476192.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。