剑指 Offer 11

89 阅读4分钟

方法一:暴力求解法(执行用时:0 ms 内存消耗:5.5 MB)

==============================================================================================

算法

1.从下标为0的元素开始遍历

2.每次进行比较,如果当前元素比相邻的下一个元素大,则对应的下一元素即为最小值.如果查到最后一个元素都没有出现这种情况,则下标为0的元素为最小元素(因为此时说明数组中有重复的元素)

int minArray(int* numbers, int numbersSize){

int i,j;

int min=numbers[0];

for(i=0;i<numbersSize;i++)

{

if(min>numbers[i])

{

min=numbers[i];

}

}

return min;

}

在这里插入图片描述

方法二:二分法(执行用时:0 ms 内存消耗:5.5 MB)

============================================================================================

一般二分查找的过程介绍

1.找到中间的关键字

2.比较查找的关键字与中间关键字的大小关系

3.如果相等就相当于已经找到

4.如果查找的关键字小于中间的关键字则在前半部分进行同样的过程(从小到大存储)

5.如果查找的关键字大于中间的关键字则在后半部分进行同样的过程(从小到大存储)

一般二分查找的要求

1.顺序存储

2.元素有序

原因

1.通过下标即可得到关键字

2.任取一个关键字的值即可确定所寻找关键字是在它前面还是后面

算法

1.从下标为0的元素开始遍历

2.每次进行比较,如果当前元素比相邻的下一个元素大,则对应的下一元素即为最小值.如果查到最后一个元素都没有出现这种情况,则下标为0的元素为最小元素(因为此时说明数组中有重复的元素)

情况一:当没有重复数字的时候

如果numbers[mid]>numbers[right],则前半部分一定是顺序的,最小值(分界点)在mid后面

因此我们就可以缩小查找范围,直接到mid后面找最小的元素

在这里插入图片描述

如果numbers[mid]<numbers[right],则后半部分一定是顺序的,最小值(分界点)在mid前面

因此我们就可以缩小查找范围,直接到mid前面找最小的元素

在这里插入图片描述

情况二:当有重复数字的时候

会出现numbers[mid]== numbers[right]的情况

此时我们并不能确定到底分界点出现在mid的前面还是后面

在这里插入图片描述

解决方法:暴力地从右到左进行遍历,知道mid指针的元素小于right指针的元素

在这里插入图片描述

int minArray(int* numbers, int numbersSize){

int left=0,right=numbersSize-1,mid;

while(left<right)

{

mid=left+(right-left)/2;

if(numbers[mid]<numbers[right])

{

right=mid;

}

else if(numbers[mid]>numbers[right])

{

left=mid+1;

}

else

{

right--;

}

}

return numbers[left];

}

在这里插入图片描述

总结

================================================================

感觉暴力法好简单呀哈哈哈

最后,我想在这里记录一下我的生活:

最近我早上是5点四十起床

看到了早晨六点的教室,晚上是十点回宿舍,因为阿姨会赶人呜呜呜~

在这里插入图片描述

还找到了一个一起努力的学长,突然感觉自己也挺幸福的呀,看看我们之间的对话:

在这里插入图片描述

所以小猪猪一定要往前冲呀!!!!!!!

在这里插入图片描述

[

与50位技术专家面对面

收集整理了一份《2024年最新Python全套学习资料》免费送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。 img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

了解详情:docs.qq.com/doc/DSnl3ZG…