一些感想
说真的,对于刷题我的热情是一阵一阵的,更多的时候一天从早到晚我甚至都不想接触电脑上有关学习相关的任何东西。
但是一旦想到了,我要记录这些日子,我要写我的博客,我要在这些感想和尾部的再见中写上我的小时光,就感觉还是愿意的。
由“想写点什么”的心思进而引发了去敲代码,在记录的过程中又希望自己可以写得更精准、更有深度、更丰富,也算是喜欢写东西而让生活稍微充实了一些吧。
剑指 Offer 40. 最小的k个数
题目描述
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
前言
这个题挺简单的,但是之前,对于vector数组排序相关的库函数,我不太清楚。借此机会学习一下。
知识点
vector排序函数
vector<int> v={3,4,7,0};
sort(v.begin(),v.end());
这个了需要说一个我误会的地方,我一直以为v.begin()是返回这个数组的第一个数字,直到我运行了一下:
cout<<v.begin()<<endl;
程序崩溃了,我才知道,原来不是这样的。
v[ i ] 和 * (v.begin() + i) 才是等价的。
迭代器
迭代器可以理解为一种类似于指针的东西,通过迭代器我们可以读容器中的元素值,还可以修改某个迭代器所指向的元素值。
迭代器的定义
vector<typename>::iterator it;
begin(): 返回迭代器所指容器中的第一个元素
end() :返回迭代器所指容器中的最后一个元素的下一个位置
vector<int>values{1,2,3,4,5};
auto first = values.begin();
auto end = values.end();
剑指 Offer 11. 旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。
注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。
前言
我选择的方法是暴力求解,但是解答区有个很好的方法,是二分法。
思路
排序数组的查找问题首先考虑使用 二分法 解决,其可将 遍历法 的 线性级别 时间复杂度降低至 对数级别 。
- 初始化:将位置所在的区间范围初始化,分别用i、j双指针指向nums数组的两端,代指范围。
- 循环二分:设置中间值m,而 m = ( i + j ) % 2 ;接下来分别有三种情况:
(1)nums[m] > nums[j],这时候,所寻位置 x 肯定位于区间[m+1,j]内,则执行 i = m + 1;
(2)nums[m] < nums[j],这时候,所寻位置x肯定位于区间[i,m]内,则执行 j = m;
(3)nums[m] = nums[j],这时候没办法确定x在哪个区间,则执行 j=j−1j=j−1 缩小判断范围 - 返回值: 当 i = j 时跳出二分循环,并返回值 nums[i] 。
备注:针对于此题,不能用nums[m]和nums[i]作比较。
再见
这个本应该昨天发布,但是昨天我觉得太累了没有继续做完,然后早早地躺到了床上。今天想到还有昨天未完成的任务,感觉好像吃放到了第二顿的食物一样索然无味。不过还是尽量认真的去理解昨天没搞完的知识点,借着力扣上面的分析,把总体思路写下来。再见啦,我要写今天的博客了,一篇属于3.4的博客!一顿新鲜出炉的饭!