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

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。

    ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。

    编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。

    示例 1:

    输入: nums = [2,5,6,0,0,1,2], target = 0
    输出: true
    示例 2:

    输入: nums = [2,5,6,0,0,1,2], target = 3
    输出: false

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

     1 public class _81 {
     2     public boolean search(int[] nums, int target) {
     3         if (nums.length == 2) return nums[0] == target || nums[1] == target;
     4         if (nums.length == 1) return nums[0] == target;
     5         if (nums.length == 0) return false;
     6         int low = 0, high = nums.length-1, mid = (low+high)/2;
     7         int nsl = 0, nsr = high;
     8 
     9         if (nums[low] == nums[mid] && nums[mid] == nums[high]) {
    10             for (int i = 0; i < nums.length; i++)
    11                 if (nums[i] == target)
    12                     return true;
    13             return false;
    14         }
    15 
    16         // 找出有序的那部分
    17         int[] t = null;
    18         if (nums[mid] <= nums[high]){ // 左边旋转过,右边有序
    19             t = Arrays.copyOfRange(nums, mid, high+1);
    20             nsl = low;
    21             nsr = mid+1;
    22         } else {
    23             t = Arrays.copyOfRange(nums, low, mid+1);
    24             nsl = mid;
    25             nsr = high+1;
    26         }
    27         int res = Arrays.binarySearch(t, target);
    28         if (res >= 0) return true;
    29 
    30         // 判断无序的左边是否存在target
    31         return search(Arrays.copyOfRange(nums, nsl, nsr), target);
    32     }
    33 
    34     public static void main(String[] args) {
    35         int[] nums = {1,1,1,1,1,1,1,2,1,1};
    36         boolean res = new _81().search(nums, 2);
    37         System.out.println("res = " + res);
    38     }
    39 }

     稍微改进下。

     1 public class _81 {
     2     public boolean binarySearch(int[] nums, int low, int high, int target){ // 包括high位置
     3         int mid;
     4 
     5         while(low <= high){
     6             mid = (low+high)/2;
     7             if (nums[mid] < target){
     8                 low = mid+1;
     9             } else if (nums[mid] > target){
    10                 high = mid - 1;
    11             } else {
    12                 return true;
    13             }
    14         }
    15         return false;
    16     }
    17     public boolean result(int[] nums, int target, int low, int high){
    18         if (low+1==high) return nums[low] == target || nums[high] == target;
    19         if (low == high) return nums[low] == target;
    20         int mid = (low+high)/2;
    21 
    22         if (nums[low] == nums[mid] && nums[mid] == nums[high]) {
    23             for (int i = low; i <= high; i++)
    24                 if (nums[i] == target)
    25                     return true;
    26             return false;
    27         }
    28 
    29         if (nums[mid] <= nums[high]){ // 右边有序,且taregt存在于右边
    30             if (target <= nums[high] && target >= nums[mid])
    31                 return binarySearch(nums, mid, high, target);
    32             // 查找无序的左边
    33             return result(nums, target, low, mid);
    34         }
    35         if (nums[low] <= nums[mid]){ // 左边有序,且target存在于左边
    36             if (target <= nums[mid] && target >= nums[low])
    37                 return binarySearch(nums, low, mid, target);
    38             // 查找无序的右边
    39             return result(nums, target, mid, high);
    40         }
    41         return false;
    42     }
    43     public boolean search(int[] nums, int target) {
    44         if (nums.length == 2) return nums[0] == target || nums[1] == target;
    45         if (nums.length == 1) return nums[0] == target;
    46         if (nums.length == 0) return false;
    47         return result(nums, target, 0, nums.length-1);
    48     }
    49 
    50     public static void main(String[] args) {
    51         int[] nums = {2,5,6,0,0,1,2};
    52         boolean res = new _81().search(nums, 8);
    53         System.out.println("res = " + res);
    54     }
    55 }
  • 相关阅读:
    mybatis的mapper文件中的一个标签是否可以写多条SQL语句?是否存在事物?
    Filebeat快速入门
    JVM第一弹
    eclipse git 解决冲突 解决 mergetool 不能使用问题
    使用gitee作为图床 编写markdown自动上传文件
    JVM面试题 第一弹
    学习了JsonSchema,我自定义了一个校验代码
    JsonSchema用法
    Docker简介与安装
    Docker第二弹之常用命令
  • 原文地址:https://www.cnblogs.com/yfs123456/p/11523055.html
Copyright © 2011-2022 走看看