你好!!!我是潮倾,最近做的这个旋转数组,涉及到了二分法的相关知识
做这道题的时候先回忆一下二分查找我看的是一位up发的视频,链接是https://www.bilibili.com/video/BV1d54y1q7k7/?spm_id_from=333.337.search-card.all.click
我觉得讲的还挺生动的(我比较笨)
题目如下
放一下时间限制,有件事很好笑就是我做的时候有一版是1001ms哈哈哈哈救命
成功通过的代码如下
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param numsLen int nums数组长度
* @return int整型
*/
int minNumberInRotateArray(int* nums, int numsLen ) {
// write code here
int left=0,right=numsLen-1;
//以右边边界为边界参考,缩小总长度,中间值小于最右,最小值在左边;中间值大于最右,最小值在右半边;中间值等于最右值,从右边界往里缩
if (numsLen == 1) {
return nums[0];
} else if (numsLen == 2) {
return nums[0] < nums[1] ? nums[0] : nums[1];
}
while(left+1!=right)
{
int mid=(left+right)/2;
if(nums[mid]<nums[right])
right=mid;
else if(nums[mid]>nums[right])
left=mid;
else
{
right--;
}
}
if(nums[left]<nums[right])
return nums[left];
else
return nums[left+1];
}
中途曾经遇到的问题
1
.超时啦,这样写的超了1ms(捂脸)
2.还差一种情况,没有偏转,还一直缩,例如1,2,2,2,2,2,2这种
加上了判断
心得
1.根据题中条件,把AB两个部分组成的原数组,把他们变成BA,就是旋转数组。那么A区间的数是不大于B区间的数。同样BA两个区域,分别又都是有序的,A区间最大的值在最右端,所以缩小范围查找选择从最右端一个一个往里缩更好。然后再找新的中间值就可以二分往里缩了。
2.最开始总是考虑不全面,研究了好久(我真的笨),最开始想的就是一直二分,根本没想那种中间值跟边界值相等的情况
3.超时的时候我自己都被自己整笑了
加油!(ง •_•)ง