8--数组旋转

 /*
题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素,
例如:数组{3,4,5,1,2}。为{1,2,3,4,5}的一个旋转,
该数组但最小值为1.

解题思路:
(1):遍历数组,发现最小值,复杂度为    O(n)
(2):二分查找,实现复杂度为    O(logN)
 */
#include <stdio.h>

//通过遍历来求解最小值
int findInOrderMin(int numbers[], int length)
{
    if (numbers == NULL || length <= 0)
        return -1;

    int num = numbers[0];
    for (int i = 1; i < length; i++)
    {
        if (num > numbers[i])
            num = numbers[i];
    }

    return num;
}

int findMinNum(int numbers[], int length)
{
    if (numbers == NULL || length <= 0)
        return -1;
    int index1 = 0;
    int index2 = length - 1;
    int indexMid = index1;

    while (numbers[index1] >= numbers[index2])
    {
        if (index2 - index1 == 1)    //当只有2个元素时,因为前面的大于后面的,所以index2小。
        {
            return numbers[index2];
        }

        indexMid = (index1 + index2)/2;    

        //有两种情况:中间的数字和两边的都相等。
        //1——[1,0,1,1,1] 和 2——[1,1,1,0,1]
        if (numbers[indexMid] == numbers[index2] && numbers[index1] == numbers[index2])
            return findInOrderMin(numbers, length);

        //如果中间数字大于第一个,那么就说明开始位置到中间位置一直递增,这样,最小值在后半段。
        if (numbers[indexMid] >= numbers[index1])
            index1 = indexMid;
        //如果中间数字小于最后数字,说明后面一直递增。这样,最小值在前半段。
        else if (numbers[indexMid] < numbers[index2])
            index2 = indexMid;

    }
    return numbers[indexMid];
}

int main()
{
    int numbers1[] = {3,4,5,1,2};
    int numbers2[] = {1,2,2,2,2};
    int numbers3[] = {2,1,2,2,2};
    int numbers4[] = {2,2,2,1,2};

    printf("%d\n", findMinNum(numbers1, 5));
    printf("%d\n", findMinNum(numbers2, 5));
    printf("%d\n", findMinNum(numbers3, 5));
    printf("%d\n", findMinNum(numbers4, 5));
    return 0;
}
时间: 2024-10-24 23:08:16

8--数组旋转的相关文章

算法练习:一维数组旋转

题目描述:求一个一维数组向右旋转K个位置后的结果.比如,一维数组{1, 2, 3, 4, 5},当k = 2时,求得的结果为{4, 5, 1, 2, 3}.要求常数级空间复杂度,允许修改原有数组. 一.使用额外的空间(在不要求常数级空间复杂度的情况下) 这样很简单,使用一个额外的空间,保存原有数组的元素,然后可以错位复制原有数组 元素,即可达到题目的要求.比如数组{1, 2, 3, 4, 5},当k = 2时,先将4,5复制到结果数组,然后将1,2,3复制到结果数组的后面部分. //使用额外空间

C++求有序数组旋转之后的最小数字

//问题是:有一万个员工在公司上班,公司为了统计上班人的年纪分布情况, //请将这一万多的人的年纪进行排序,分析一个比较好的算法. #include <iostream> #include <vector> #include <stdlib.h> #include <string.h> #include <stdio.h> #define _MAX_AGE_ 100 #define _MIN_AGE_ 0 #define _EXIT_ cout&

leetcode 7. 在有序可重复数组旋转后搜索 Search in Rotated Sorted Array II

Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this affect the run-time complexity? How and why? Write a function to determine if a given target is in the array. 解题思路: 本题基于

练习-二维数组旋转

#slist = [[i for i in range(4)] for l in range(8)] # slist = [ # [4, 5, 2, 7], # [8, 7, 4, 2], # [1, 9, 7, 3], # [0, 4, 5, 6], # ] # 4*4 slist = [ [4, 5, 2, 7], [8, 7, 4, 2], [1, 9, 7, 3], [0, 4, 5, 6], [1, 9, 7, 3], ] # 4*5 # slist = [ # [1, 0, 1, 8

day4 二维数组旋转90度

二维数组的旋转其实就是数组里面的元素对调的情况:下面有一个4×4的二维数组,[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]],现在要求把二维数组转化为下列形式,[[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]].下面来看一下流程图: 流程图: 流程图如上面所示,就是进行简单的互换而已,下面我们来用代码实现行列互换: data = [[i for i in range(4)

【Python】将4*4数组旋转90度新数组

需求:将一个4*4的数组90度旋转生成新的4*4数组 原来的4*4数组:[0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3]90度旋转后的4*4数组:[0, 0, 0, 0][1, 1, 1, 1][2, 2, 2, 2][3, 3, 3, 3] 图解过程: 第一步: 第二步: 第三步: 代码如下: 1 # 初始化一个4*4的数组 2 array =[ [col for col in range(4)] for row in range(4)] 3 #

[数组]旋转数组

旋转数组起始就是数组元素的循环左移或者循环右移.例如:{3,4,5,1,2}为{1,2,3,4,5}的一个旋转数组.旋转数组是在非降序数组的基础上得到的,所以数组原本应该是有序的. 有序数组到旋转数组 如果真的利用循环左移或者循环右移来实现旋转数组,那么将有大量的元素要移动,所以一个好的方法要尽量的减少数组中元素的移动. 方法: 1.对数组的前部分元素做逆序操作 2.对数组的后部分元素做逆序操作 3.对数组的所有元素整体做逆序操作 逆序操作利用两个指针,一个头指针一个尾指针,都往中间移动,一次交

数组旋转

问题: 返回将一维数组向右旋转K个位置的结果.比如,一维数组{1,2,3,4,5},k=2时,返回结果是{4,5,1,2,3}.要求常数级空间复杂度,允许修改原有数组 看到一个比较巧妙的方法,将数组反转三次,第一次反转整个数组,第二次反转数组的前K个数,第三次反转数组剩下的数. 每次反转的时间为O(N). 例如, 一维数组{1,2,3,4,5},k=2 第一次反转:5,4,3,2,1 第二次反转:4,5,3,2,1 第三次反转:4,5,1,2,3 即为最终结果 代码入下: int[] rotat

leetcode 6. 在有序数组旋转后搜索 Search in Rotated Sorted Array

Search in Rotated Sorted Array 难度:Hard Suppose a sorted array 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, otherw

算法之二维数组旋转

现在有个二维数组:data=[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,2,3],每一行都是[0,1,2,3],要求顺时针旋转90度,变成每一列都是[0,1,2,3]. #首先生成一维数组的语句是: row=[i for i in range(6)] print(row) #运行结果: #[0, 1, 2, 3, 4, 5] #生成二维数组的语句是: data=[[i for i in range(4)] for k in range(4)] for j in data