33. Search in Rotated Sorted Array

本文介绍在旋转后的有序数组中高效查找目标值的方法,探讨了三种算法实现:暴力查找、改进的二分查找及优化版暴力查找。重点在于如何将问题转化为标准的二分查找,达到O(logN)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
Your algorithm’s runtime complexity must be in the order of O(log n).
Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

来自 https://leetcode.com/problems/search-in-rotated-sorted-array/

分析:

要求查找的时间复杂度为O(logN),常用的查找就是二分查找,时间复杂度就是这个,因此应该往转成二分查找的方向想。

方法1:
试试直接暴力的查找会怎么样

//beats 28%
    int search(vector<int>& nums, int target) {
        
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]==target)
                return i;
        }
        return -1;
    }

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

方法2:
基于二分查找,先找出旋转中心,这个相对简单,只要判断前后两个元素不是递增就可以。然后判断目标值在旋转中心的左、右哪个区间,最后对选定的区间进行二分查找。

//二分查找
int binarysearch(vector<int>&nums, int begin, int end,int target)
{
	if (begin > end)
		return -1;
	else
	{
		int mid = (begin + end) / 2;
		if (nums[mid] == target)
			return mid;
		else if (nums[mid] > target)
			return binarysearch(nums, begin, mid-1, target);
		else
			return binarysearch(nums, mid+1, end, target);
	}
}

//beats 99%
int search(vector<int>& nums, int target)
{
	if (nums.size() == 0)return -1;
	if (nums.size() == 1) return nums[0] == target?0:-1;
	int L = nums.size(); int i = 0;int index = L-1;
	while (i < L - 1)
	{
		if (nums[i] >= nums[i + 1]) { index = i; break; }
		i++;
	}
	if (target >= nums[0])
		return binarysearch(nums, 0, index, target);
	else
		return binarysearch(nums, index+1, L - 1, target);
}

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

方法3:
比较取巧:和方法1类似,区别是有头脑的莽夫

int search(vector<int>& nums, int target) {
    	if(nums.size() == 0) return -1;
        if(nums[0] == target) return 0;
        if(nums.size() == 1 && nums[0] != target) return -1;

        if(nums[0] < target){
        	for(int i = 1; i < nums.size(); ++i){
        		if(nums[i] == target) return i;
        		if(nums[i - 1] > nums[i]) return -1;
        	}
        }
        else{
        	for(int i = nums.size() - 1; i >= 1; --i){	
        		if(nums[i] == target) return i;
        		if(nums[i - 1] > nums[i]) return -1;
        	}
        }
        return -1;
    }
内容概要:本文档详细介绍了一个基于MATLAB实现的跨尺度注意力机制(CSA)结合Transformer编码器的多变量时间序列预测项目。项目旨在精准捕捉多尺度时间序列特征,提升多变量时间序列的预测性能,降低模型计算复杂度与训练时间,增强模型的解释性和可视化能力。通过跨尺度注意力机制,模型可以同时捕获局部细节和全局趋势,显著提升预测精度和泛化能力。文档还探讨了项目面临的挑战,如多尺度特征融合、多变量复杂依赖关系、计算资源瓶颈等问题,并提出了相应的解决方案。此外,项目模型架构包括跨尺度注意力机制模块、Transformer编码器层和输出预测层,文档最后提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,尤其是熟悉MATLAB和深度学习的科研人员、工程师和研究生。 使用场景及目标:①需要处理多变量、多尺度时间序列数据的研究和应用场景,如金融市场分析、气象预测、工业设备监控、交通流量预测等;②希望深入了解跨尺度注意力机制和Transformer编码器在时间序列预测中的应用;③希望通过MATLAB实现高效的多变量时间序列预测模型,提升预测精度和模型解释性。 其他说明:此项目不仅提供了一种新的技术路径来处理复杂的时间序列数据,还推动了多领域多变量时间序列应用的创新。文档中的代码示例和详细的模型描述有助于读者快速理解和复现该项目,促进学术和技术交流。建议读者在实践中结合自己的数据集进行调试和优化,以达到最佳的预测效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值