微站平台,创建一个网站的英文,新零售商业模式,曹县建设厅网站Medium#xff01; 题目描述#xff1a; 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如#xff0c;数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true#xff0c;否则返回 false。 示… Medium 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如数组 [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 进阶: 这是 搜索旋转排序数组 的延伸题目本题中的 nums 可能包含重复元素。这会影响到程序的时间复杂度吗会有怎样的影响为什么 解题思路 这道是之前那道 Search in Rotated Sorted Array 在旋转有序数组中搜索 的延伸现在数组中允许出现重复数字这个也会影响我们选择哪半边继续搜索由于之前那道题不存在相同值我们在比较中间值和最右值时就完全符合之前所说的规律如果中间的数小于最右边的数则右半段是有序的若中间数大于最右边数则左半段是有序的。而如果可以有重复值就会出现来面两种情况[3 1 1] 和 [1 1 3 1]对于这两种情况中间值等于最右值时目标值3既可以在左边又可以在右边那怎么办么对于这种情况其实处理非常简单只要把最右值向左一位即可继续循环如果还相同则继续移直到移到不同值为止然后其他部分还采用 Search in Rotated Sorted Array 在旋转有序数组中搜索 中的方法可以得到代码如下。 C解法一 1 class Solution {2 public:3 bool search(int A[], int n, int target) {4 if (n 0) return false;5 int left 0, right n - 1;6 while (left right) {7 int mid (left right) / 2;8 if (A[mid] target) return true;9 else if (A[mid] A[right]) {
10 if (A[mid] target A[right] target) left mid 1;
11 else right mid - 1;
12 } else if (A[mid] A[right]){
13 if (A[left] target A[mid] target) right mid - 1;
14 else left mid 1;
15 } else --right;
16 }
17 return false;
18 }
19 }; 转载于:https://www.cnblogs.com/ariel-dreamland/p/9159124.html