终于还是踏上了算法这条不归路,记录一下做题的历程
搜索旋转排序数组 II
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为[nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …,nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为[4,5,6,6,7,0,1,2,4,4] 。
给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums中存在这个目标值 target ,则返回 true ,否则返回 false 。
示例
输入:nums = [2,5,6,0,0,1,2], target = 0
输出:true
输入:nums = [2,5,6,0,0,1,2], target = 3
输出:false
二分查找
二分查找是一种效率较高的查找方法,前提是数据结构必须先排好序,可以在数据规模的对数时间复杂度内完成查找。
数据整体或数据的一边满足一定的规律时,可以缩减问题的规模(舍弃一边,缩短查找区间),以达到降低查找某特定值的时间复杂度。
代码
class Solution {
public:
bool search(vector<int> &nums, int target) {
int n = nums.size();
if (n == 0) { // 特殊情况
return false;
}
if (n == 1) { // 直接判断该元素是否和目标值相等
return nums[0] == target;
}
int l = 0, r = n - 1;
while (l <= r) { // l > r 时二分搜索结束
int mid = (l + r) / 2; // 寻找有序的一边
if (nums[mid] == target) { // 直接判断中间值是否和目标值相等
return true;
}
if (nums[l] == nums[mid] && nums[mid] == nums[r]) { // 相等时无法判定那边有序,左右边界进行相对移动后再判断。
++l;
--r;
} else if (nums[l] <= nums[mid]) { // 左边界小于等于中间值,左边有序。
if (nums[l] <= target && target < nums[mid]) { // 判断目标值是否在此区间内,在区间内则遍历这个区间,判断数组内元素是否存在和目标值相等的值。
r = mid - 1;
} else { // 不在则遍历无序的一边。
l = mid + 1;
}
} else { // 左边界大于中间值,右边有序
if (nums[mid] < target && target <= nums[n - 1]) { // 同上判断目标值是否在有序的区间内。
l = mid + 1;
} else {
r = mid - 1;
}
}
}
return false;
}
};
暴力解法
直接遍历整个数组(狗头)
代码
bool search(int* nums, int numsSize, int target){
for(int i=0;i<numsSize;++i)
if(nums[i] == target)
return true;
return false;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii