C语言每日一题之旋转数求最小值

简介: C语言每日一题之旋转数求最小值

hello,今天我们分享一道题目,是牛客网上的一道题

求旋转数组中的最小值https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=23269&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

那我们先来看一下题目的意思,首先要读懂题目讲的是什么

题目说一个非降序数组,什么是非降序呢,像1 2 3 4 5这种升序 也可以是1 1 2 2 3 4这种,但是大家可不要误解认为他是非序,非序就是随机数这些。

这道题呢有两种解法,一种就是我们从前往后一个一个比较过去,先定义一个min=首项,然后比他小的就赋值给min,这种大家就会,那今天我们就讲一下用二分查找的思路来给大家写

二分查找呢就是一个有序数组中,我们想要找一个数的位置的时候 ,我们取中间的数来进行比较,比如有一个升序数组,我们取出中间数,和我们要取的值进行比较,如果大于中间数,说明这个数在这个中间数的后面,那我们取中间数后面的数一直到最后的数的中间数,在进行比较,经过我们这样找数的方式,可以快速的找到它的位置

那我们就可以用这样的思路来分析这道题

  1. 中间大于右边 [3, 4, 5, 1, 2],这种情况下,最小数一定在右边;则left = middle + 1
  2. 中间等于右边 [1, 0, 1, 1, 1], 这个是[0, 1, 1, 1, 1] 旋转过来的,这时候需要缩小范围 right–;,注意不能是
    left++,因为是非降序数组,所以要缩小右边范围,把较小值向右推,符合我们的判断规则。
  3. 中间小于右边 [5, 1, 2, 3, 4], 这种情况下,最小数字则在左半边;则right = middle
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
if (rotateArrayLen == 0) return 0;
int left = 0, right = rotateArrayLen - 1, mid;
if (rotateArray[right] > rotateArray[left]) return rotateArray[0];
while(left < right) {
mid = left + (right - left) / 2;
if (rotateArray[mid] > rotateArray[right]) left=mid+1;
//中间的数大,那么我们就要往mid后面找,说明最小值在mid后面
//而且保证mid不是最小数,因为right有更小的数
else if (rotateArray[mid] == rotateArray[right]) right--;
//如果是这样的旋转数{0,1,1,1,1,1,1}
else right = mid;//中间的数小,那我们就要往右边找,而且这个中间数也可以是最小的数,所以不能写成right=mid-1
}
return rotateArray[left];//因为只有right=left的时候while循环条件不满足,那么才会退出循环,所以这里写right也对
}

今天的分享就到这,我们一起加油



相关文章
|
6月前
|
存储 算法 大数据
C语言中求解数组的最大值和最小值
C语言中求解数组的最大值和最小值
500 0
|
6月前
|
算法 C语言
Leetcode----旋转数组 ------C语言篇
Leetcode----旋转数组 ------C语言篇
|
6月前
|
C语言 容器
从C语言到C++_27(AVL树)概念+插入接口实现(四种旋转)(上)
从C语言到C++_27(AVL树)概念+插入接口实现(四种旋转)
49 4
|
6月前
|
C语言 C++
从C语言到C++_27(AVL树)概念+插入接口实现(四种旋转)(下)
从C语言到C++_27(AVL树)概念+插入接口实现(四种旋转)
53 2
|
6月前
|
存储 程序员 C语言
你绝对想不到数组最大值和最小值在C语言中这么简单,手慢无!
你绝对想不到数组最大值和最小值在C语言中这么简单,手慢无!
|
C语言
LeetCode二维数组例题(原地旋转和对角线遍历)-c语言
LeetCode二维数组例题(原地旋转和对角线遍历)-c语言
128 0
|
6月前
|
C语言
C语言第四十二弹---使用多种方法实现字符串左旋转
C语言第四十二弹---使用多种方法实现字符串左旋转
|
C语言
字符串的左旋和判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言实现)
字符串的左旋和判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言实现)
|
存储 C语言
【C语言—零基础第十一课】旋转大转盘之指针
在生活中我们应该玩过旋转大转盘游戏,指针指到哪个物品我就拿走哪一个物品,这个就是指针。在现实生活中你玩旋转大转盘游戏最后获奖了吗?还有一种就是我们的门牌号我们可以把它想象成为指针,只要我们和其他人说了我们的门牌号他就可以顺着门牌号找到你,而在我们C语言中也有指针。
120 0
|
C语言
【旋转字符】C语言
【旋转字符】C语言