欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][第33题][搜索旋转排序数组]

发布时间:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 [Leedcode][JAVA][第33题][搜索旋转排序数组] 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

【问题描述】[33. 搜索旋转排序数组] [中等]

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4

【解答思路】

1. 暴力法 (不符合题意)

时间复杂度:O(N) 空间复杂度:O(1)

public class Solution {public int search(int[] nums, int target) {int len = nums.length;for (int i = 0; i < len; i++) {if (nums[i] == target) {return i;}}return -1;} }
2. 二分查找 修改版

时间复杂度:O(logN) 空间复杂度:O(1)

public int search(int[] nums, int target) {int left= 0;int right = nums.length-1;while(left <=right){int mid = (right - left ) /2 +left;if(target == nums[mid] ){return mid;}先根据 nums[mid] 与 nums[lo] 的关系判断 mid 是在左段还是右段 if(nums[mid] <nums[right]){if (nums[mid] <= target && target <= nums[right]) {// 下一轮搜索区间是 [mid+1, right]left = mid+1;} else {// 只要上面对了,这个区间是上面区间的反面区间,下一轮搜索区间是 [left, mid - 1]right = mid - 1;}}else{ // [left, mid] 有序,但是为了和上一个 if 有同样的收缩行为,// 当区间只有 2 个元素的时候 int mid = (left + right + 1) >>> 1; 一定会取到右边// 此时 mid - 1 不会越界,就是这么刚刚好if (nums[left] <= target && target <= nums[mid]) {/// 下一轮搜索区间是 [left, mid - 1]right = mid-1;} else {// 下一轮搜索区间是 [mid+1, right]left = mid+1;}}}return -1 ;}
3. 有序数组查找目标值 + 二分查找

class Solution {public int search(int[] nums, int target) {int lo = 0, hi = nums.length - 1;while (lo <= hi) {int mid = lo + (hi - lo) / 2;if (nums[mid] == target) {return mid;}// 先根据 nums[0] 与 target 的关系判断目标值是在左半段还是右半段if (target >= nums[0]) {// 目标值在左半段时,若 mid 在右半段,则将 mid 索引的值改成 infif (nums[mid] < nums[0]) {nums[mid] = Integer.MAX_VALUE;}} else {// 目标值在右半段时,若 mid 在左半段,则将 mid 索引的值改成 -infif (nums[mid] >= nums[0]) {nums[mid] = Integer.MIN_VALUE;}}if (nums[mid] < target) {lo = mid + 1;} else {hi = mid - 1;}}return -1;} }

【总结】

1. 二分查找模板[详解链接]
int binary_search(int[] nums, int target) {int left = 0, right = nums.length - 1; // <=while(left <= right) {int mid = left + (right - left) / 2;//防止大数溢出if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1; } else if(nums[mid] == target) {// 直接返回return mid;}}// 直接返回return -1; }
2. 排除法找规律分析 不要想着一蹴而就
  • 有序增长的部分分开思考 一蹴而就
  • if -else 好想的条件放进if 其余else
3. 该有的模板初期要不断总结 根据模板发散思考 切忌想当然

创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的[Leedcode][JAVA][第33题][搜索旋转排序数组]的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。