zoukankan      html  css  js  c++  java
  • 33.搜索旋转排序数组

    题目描述查看:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/

      题目的意思是从一个位置颠倒有序数组,让它变成两部分有序,从这个两部分有序的数组中,找一个特定的值存不存在。题目要求的时间复杂度O(logn),提醒我们用到二分查找。

    • 思路

    设定left,right,mid指针,对数组进行二分查找。

    先判断mid落在哪个有序区间上,在看target在mid的左边还是右边。

    如果mid比left值大,说明落在了颠倒位置的左边,即在左边有序位置进行二分查找即可。

    1 if(nums[left] <= nums[mid]) {
    2     if (nums[left] <= target && target < nums[mid]) right = mid - 1;
    3     else
    4         left = mid + 1;
    5 }

    如果mid比left值小,说明落在了右边的有序序列中,在右边的有序序列进行二分查找。

    1 else {
    2     if (target > nums[mid] && target <= nums[right]) left = mid + 1;
    3     else
    4     right = mid - 1;
    5 }

    • 边界条件    

    6行,while循环里的等号。当查找的值是left == right时,没有等号,不会执行循环里的if(nums[mid] == target)return mid,直接跳出循环返回-1,发生错误。

     10行,14行的等号,由于left和right是mid+1得到的,下一次查找的范围应该是左边这一堆或者右边这一堆,需要包括nums[left]和nums[right]。

     1 class Solution {
     2     public int search(int[] nums, int target) {
     3         if(nums.length == 0)return -1;
     4         int left = 0;
     5         int right = nums.length -1;
     6         while (left <= right){
     7             int mid = left + (right - left) /2;
     8             if(nums[mid] == target)return mid;
     9             if(nums[left] <= nums[mid]) {
    10                 if (nums[left] <= target && target < nums[mid]) right = mid - 1;
    11                 else
    12                     left = mid + 1;
    13             }else {
    14                 if (target > nums[mid] && target <= nums[right]) left = mid + 1;
    15                 else
    16                     right = mid - 1;
    17             }
    18         }
    19             return -1;
    20     }
    21 }
    •  二分查找模板

     1     public static int search(int[] nums, int target) {
     2         if(nums.length == 0){
     3             return -1;
     4         }
     5         int left = 0;
     6         int right = nums.length -1;
     7         while(left <= right){
     8             int mid = left + (right - left)/2;
     9             if(target == nums[mid])return mid;
    10             else if(target > nums[mid])left = mid +1;
    11             else right = mid -1;
    12         }
    13         return -1;
    14     }

          

  • 相关阅读:
    Direct3D 光照和材质
    UGUI 过渡动画插件,模仿NGUI的Tween (转载)
    Unity 功夫猫
    LinkedList和List在三种简单算法中效率比较
    学习Modern UI for WPF
    H3 BPM Sheet表单 NTKO功能使用说明
    H3 BPM MVC表单SheetOffice控件使用分享
    H3 BPM初次安装常见错误详解5-7
    吕学敏:全面、细致功能锻造灵活审批
    华陆工程——业务流程管理方案
  • 原文地址:https://www.cnblogs.com/vshen999/p/12584562.html
Copyright © 2011-2022 走看看