NC704二分查找
二分查找只针对有序数组进行查找,如果无序,需排序后才能进行查找。
递归查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 8
解释: -1 8不存在数组中,返回-1
二分查找思路分析
- 首先确认该数组中间的下标 即 (left+right)/2
- 然后使需要查找的数target与nums[mid]进行比较
- 如果nums[mid] < target,那证明该数在二分的右边,因此需要递归的向右查找
- 如果nums[mid] > target,那证明该数在二分的左边,因此需要递归的向左查找
- 如果nums[mid] = target,直接返回
- 退出递归的条件:
- 当找到数据时,结束递归
- 当遍历完后找不到数据,返回 -1 (left>right时,退出递归)
在实现题目之前,需要了解下递归是什么? 递归:自已(方法)调用自已
具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
- 一定有一种可以退出程序的情况
- 总是在尝试将一个问题简化成更小规模
- 父问题与子问题不存在重叠的部分
那接下来就是解题思路:
假设我们需要寻找的数据在数组的左边的情况下
假设在右边的情况下
** 废话不多说,上代码!!!**
/**
* 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的
* target,如果目标值存在返回下标,否则返回 -1。
*
*/
class Solution {
/**
* @param nums 传入有序数组
* @param target 传入目标值
* @return 如果存在该值,返回该值下标,如果不存在返回-1
*/
public int search(int[] nums, int target) {
/*
* 定义左边界以及右边界
*/
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
// int mid = (left + right)/2;
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
/**
* @param nums 有序数组
* @param left 左边界
* @param right 右边界
* @param target 目标数据
* @return 如果存在该值,返回该值下标,如果不存在返回-1
*/
public static int binarySearch(int[] nums, int left, int right, int target) {
int mid = (left + right) / 2;
int midValue = nums[mid];
if (left > right) {
return -1;
}
if (midValue < target) {//如果nums[mid] < target,那证明该数在二分的右边,因此需要递归的向右查找
return Solution.binarySearch(nums, mid + 1, right, target);
} else if (midValue > target) { //如果nums[mid] > target,那证明该数在二分的左边,因此需要递归的向左查找
return Solution.binarySearch(nums, left, mid - 1, target);
} else {
return mid;
}
}
public static void main(String[] args) {
//测试数据修改即可。
int[] nums = new int[]{1, 2, 3, 5, 9, 12, 18, 22, 35, 82, 92};
int target = 10;
int left = 0;
int right = nums.length - 1;
int i = Solution.binarySearch(nums, left, right, target);
System.out.println("target = " + i);
/* Solution solution = new Solution();
int num = solution.search(nums, target);
System.out.println(num);*/
}
}