厦门服装企业网站推广,肃宁县做网站价格,设计logo公司,建筑八大员报考时间和条件【问题描述】[33. 搜索旋转排序数组] [中等]
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如#xff0c;数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值#xff0c;如果数组中存在这个目标值#xff0c;则返回它的索引#xff0…【问题描述】[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]) {// 下一轮搜索区间是 [mid1, right]left mid1;} 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 {// 下一轮搜索区间是 [mid1, right]left mid1;}}}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. 该有的模板初期要不断总结 根据模板发散思考 切忌想当然