首先呢,针对的是leetcode上面的704.二分查找写的此文章,首先呢,这个题目我是跑过了的,这个题目也比较简单,就是给出一个数组,然后输入一个搜索的数,如果有就输出这个数在数组中对应的下标。首先,我写的是一个比较暴力的解法,就是完全没有运用二分的思想,就是个单纯的暴力的解法,我把代码拉过来可以看看。
int length = arr.length; int target; Scanner in = new Scanner(System.in); target = in.nextInt(); for(int i = 0;i<length;i++){ if(arr[i] == target){ System.out.println(i); } else if(i == length && target != arr[i]) { System.out.println("-1"); }
首先呢,这个解法就是比较的暴力,就是单纯的运用for循环进行解决。
接下里,才是正题,就是二分,虽然小尼之前也学过二分的思想,但是这里给出的二分的思想非常的快捷,首先,解决任何一个关于二分的问题的时候,我们先需要看到它给出的二分的条件的区间,而且这个区间也是非常的类似与我们学过的数组,可开可闭,我先先看两边都是闭的的情况。首先我们分析,两边都是闭的时候,我们在对数组操作的时候,那就是数组中的任何一个元素我们都会进行操作。不多说,拉代码
int lengh = nums.length; Scanner in = new Scanner(System.in); val = in.nextInt(); int left=0,right=lengh-1; while(left<=right){ int mid = left + (right - left)/2; if(nums[mid]>target){ right = mid - 1; } else if(mums[mid]<target){ left = mid + 1; } else{ return mid; } } return -1;
这一段代码就充分体现了二分的思想,在这一段里面,最为重要的是right与left的操作在因为这种情况是每一个元素都会进行比较,在right或left还没有被改变的时候,我们的nums[mid]就已经被比较了,所以我们下一一个区域就不用再管到mid了,所以我们就写了减一或者加一的操作,其实其他情况也是一样的,其实这就是充分体现了数组的数学上的思想,如果我们在数组中的元素需要去考虑,那么我们就先比较,比较完了就丢弃,如果我们不需要考虑,那么我们的边界取他们都无所谓(这就是其他的情况)。以上就是小尼对二分的思想的看法