https://leetcode-cn.com/problems/binary-search/

一 题目

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1: 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4

解释: 9 出现在 nums 中并且下标为 4

示例 2: 输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1

解释: 2 不存在 nums 中因此返回 -1

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

二 递归解题

  1. package top.black.leetcode.s0702binarysearch;
  2. class Solution {
  3. public int search(int[] nums, int target) {
  4. int length = nums.length;
  5. if(target<nums[0]||target>nums[length-1]){
  6. return -1;
  7. }
  8. return binarySearch(nums,0,length-1,target);
  9. }
  10. private int binarySearch(int[] nums,int start,int end,int target){
  11. if(start>end){
  12. return -1;
  13. }
  14. int binaryTag = (end -start)/2 + start;
  15. if(nums[binaryTag] == target){
  16. return binaryTag;
  17. }else if(nums[binaryTag] < target){
  18. return binarySearch(nums,binaryTag+1,end,target);
  19. }else if(nums[binaryTag] > target){
  20. return binarySearch(nums,start,binaryTag-1,target);
  21. }
  22. return -1;
  23. }
  24. public static void main(String[] args) {
  25. int[] nums = new int[]{-1,0,3,5,9,12};
  26. Solution solution = new Solution();
  27. System.out.println(solution.search(nums,4));
  28. }
  29. }

因为采用的是递归的形式进行计算,因此需要额外的内存开销。
image.png

三 动态规划解题

  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. int length = nums.length;
  4. if(target<nums[0]||target>nums[length-1]){
  5. return -1;
  6. }
  7. return binarySearch(nums,target);
  8. }
  9. private int binarySearch(int[] nums,int target){
  10. int start = 0;
  11. int end = nums.length-1;
  12. int tag = start + (end - start)/2;
  13. while (tag<=end&&tag>=start){
  14. if(nums[tag] == target){
  15. return tag;
  16. }else if(nums[tag]>target){
  17. end = tag-1;
  18. tag = start + (end - start)/2;
  19. }else if(nums[tag]<target){
  20. start = tag + 1;
  21. tag = start + (end -start)/2;
  22. }
  23. }
  24. return -1;
  25. }
  26. }