列表

详情


NC48. 在旋转过的有序数组中寻找目标值

描述

有一个长度为 n 的按严格升序排列的整数数组 nums ,在实行 search 函数之前,在某个下标 k 上进行旋转,使数组变为[nums[k],nums[k+1],.....,nums[nums.length-1],nums[0],nums[1],.......,nums[k-1]]。
给定旋转后的数组 nums 和一个整型 target ,请你查找 target 是否存在于 nums 数组中并返回其下标(从0开始计数),如果不存在请返回-1。

数据范围:

比如,数组[0,2,4,6,8,10]在下标3处旋转之后变为[6,8,10,0,2,4], 当给定target为10时,10的下标是2,target为3时,nums数组中不存在3,所以返回-1


示例1

输入:

[6,8,10,0,2,4],10

输出:

2

说明:

如题面解释

示例2

输入:

[6,8,10,0,2,4],3

输出:

-1

说明:

如题面解释

示例3

输入:

[2],1

输出:

-1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 432KB, 提交时间: 2021-09-18

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
        //6 8 10 0 2 4
        int index=0;
        for(int i=0;i<nums.size()-1;i++){
            if(nums[i]>nums[i+1]){
                index=i;
                break;
            }
        }
        int low,high;
        if(target<nums[0]){
            low=index+1;
            high=nums.size()-1;
        }else if(index!=0&&target>nums[0]){
            low=0;
            high=index;
        }else if (index==0){
            low=0;
            high=nums.size();
        }
        
        int mid;
        while(low<=high){
            mid=(high+low)/2;
            if(target<nums[mid]){
                high=mid-1;
            }else if(target>nums[mid]){
                low=mid+1;
            }else return mid;
        }
        return -1;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 456KB, 提交时间: 2021-09-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
        int ans=-1;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==target){ans=i;break;}//降序
        }
    return ans;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 516KB, 提交时间: 2021-09-05

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
        int l = 0;
        int r = nums.size() - 1;
        int mid = -1;
        while (l <= r) {
            mid = (l+r)/2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                // find bigger 
                if (nums[mid] >= nums[0]) {
                    l = mid + 1;
                } else {
                    if (target >= nums[0]) {
                        r = mid - 1;
                    } else {
                        l = mid + 1;
                    }
                }
            } else {
                // find smaller 
                if (nums[mid] < nums[0]) {
                    r = mid - 1;
                } else {
                    if (target >= nums[0]) {
                        r = mid - 1;
                    } else {
                        l = mid + 1;
                    }
                }
                
            }
        }
        return -1;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 520KB, 提交时间: 2021-09-14

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
        int i;
        for(i=0;i<nums.size();++i)
        {
            if(nums[i]==target)
                break;
        }
        if(i==nums.size()) return -1;
        return i;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 520KB, 提交时间: 2021-09-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @param target int整型
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        int n = nums.size();
        int low = 0, high = n - 1;
        while (low <= high) {
            int mid = (low + high) / 2; // 中间位置
            if (nums[mid] == target) return mid; // 找到
            if (nums[low] < nums[mid]) { // 若左边是有序的
                if (target >= nums[low] && target <= nums[mid]) { // 若目标值在区间内
                    high = mid - 1;
                } else { // 目标值不在区间内
                    low = mid + 1;
                }
            } else { // 右边是有序的
                if (target >= nums[mid] && target <= nums[high]) { // 目标值在区间内
                    low = mid + 1;
                } else { // 目标值不在区间内
                    high = mid - 1;
                }
            }
        }
        return -1;
    }
};

上一题