栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Rotated Sorted Array旋转排序数组相关题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Rotated Sorted Array旋转排序数组相关题

1.什么是Rotated Sorted Array

在leetcode相关题目中,对Rotated Sorted Array相关的定义为:
整数数组 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,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

通俗地讲,旋转数组中没有相等的数值,且该数组可以被分为连续的两部分,这两部分均按升序排列。

2.寻找旋转排序数组中的最小值

leetcode中153题,就是寻找旋转数组中的最小值。
一个不包含重复元素的升序数组在经过旋转之后,可以得到下面可视化的折线图:


从图中不难看出,假设数组中最后一个元素为x,那么最小值右侧的元素一定都比这个元素小,而最小值左侧元素都比这个值大。

进行二分查找时,假设左右边界分别为low, high,中间为pivot。

  1. nums[pivot] < nums[high],说明nums[pivot]是最小值右侧的元素,因此忽略二分查找的右半部分。

    2.nums[pivot] > nums[high],说明nums[pivot]是最小值左侧的元素,因此忽略二分查找的左半部分。

    因为数组元素不重复,只要当前区间长度不为1,pivot不会与high重合。而当区间长度为1时,说明二分查找已经结束。
int run() {
    int nums[] = {4,5,6,7,0,1,2};
    int n = sizeof(nums)/ sizeof(nums[0]);
    int left = 0, right = n - 1;
    while(left < right) {
        int pivot = (left + right) / 2;
        if (nums[pivot] < nums[right]) {
            right = pivot;
        } else {
            left = pivot + 1;
        }
    }
    return nums[left];
}

注意上面代码终止时,right刚好与left相等。

3.搜索旋转排序数组

跟上面类似的题是leetcode 33题,在一个旋转排序数组中进行搜索。

解题思路与上面类似,首先找出最小值点,就可以将数据分为有序的两部分,然后看nums[0]与target的大小。如果nums[0]

int run2() {
    int nums[] = {4,5,6,7,0,1,2};
    int n = sizeof(nums)/sizeof(nums[0])-1;
    int left = 0, right = n-1, target = 0;
    while(left < right) {
        int pivot = (left + right) / 2;
        if (nums[pivot] < nums[right]) {
            right = pivot;
        } else {
            left = pivot + 1;
        }
    }
    
    int curleft = 0, curright = 0;
    if (nums[0] < target) {
        curleft = 0, curright = left - 1;
    } else {
        curleft = left, curright = n-1;
    }
    while(curleft <= curright) {
        int mid = (curleft + curright) / 2;
        if (nums[mid] < target) {
            curleft = mid + 1;
        } else if (nums[mid] > target) {
            curright = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960031.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号