日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】33. 搜索旋转排序数组(Java、二分法)

發布時間:2024/7/23 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】33. 搜索旋转排序数组(Java、二分法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 & 代碼
      • 更新版

題目描述

  • 值互不相同:不用考慮重復值情況(要不然比較麻煩)

思路 & 代碼

  • 重點在于保證O(logn)的時間復雜度
  • 看成兩個數組:前半段 & 后半段。根據兩個數組的極值來判斷 target 在哪個數組,再進行判斷即可。
  • 先一次二分,找到前半段、后半段的分界下標。
  • 再一次二分,找到在某半段中的 target
  • 注意:要考慮極端情況:在下標0處旋轉,相當于沒有旋轉。
class Solution {public int search(int[] nums, int target) {// 思路:一次分割點查找O(logn)。兩次二分查找O(logn)int k = -1, low = 0, top = nums.length - 1;while(low <= top){k = (low + top) / 2;// 找到的情況:注意長度為1時,需要進行k + 1 == nums.length判斷if(k + 1 == nums.length || nums[k] > nums[k + 1]){break;}if(nums[k] < nums[0]){top = k - 1;}else{low = k + 1;} }// 判斷選擇在哪個部分進行二分if(target > nums[nums.length-1] || k == nums.length-1){return binary(nums,0,k,target);}else{return binary(nums,k+1,nums.length-1,target);}}public int binary(int[] nums,int left,int right,int target){// l = 0,r = -1的情況也要考慮if(left >= right){if(target == nums[left]){return left;}return -1;}int half = (left+right)/2;// 相等判斷if(target == nums[half]){return half;}// 縮短范圍,+-1去掉已判斷的halfelse if(target > nums[half]){return binary(nums,half+1,right,target);}else{return binary(nums,left,half-1,target);}} }

更新版

  • 核心在于兩次二分,以及對數組性質的使用
class Solution {public int search(int[] nums, int target) {int k = -1;int left = 0, right = nums.length - 1;while(left <= right) {k = (left + right) / 2;if(k + 1 == nums.length || nums[k] > nums[k + 1]) {break;}if(nums[k] < nums[0]) {right = k - 1;}else {left = k + 1;}}if(target > nums[nums.length - 1] || k == nums.length - 1) {return binary(nums, 0, k, target);}else {return binary(nums, k + 1, nums.length - 1, target);}}public int binary(int[] nums, int left, int right, int target) {if(left > right) {return -1;}int mid = (left + right) / 2;if(target == nums[mid]) {return mid;}else if(nums[mid] > target) {return binary(nums, left, mid - 1, target);}else {return binary(nums, mid + 1, right, target);}} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【LeetCode笔记】33. 搜索旋转排序数组(Java、二分法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。