6.旋转数组的最小数字(做第二遍时感觉仍有有难度)
来源:互联网 发布:淘宝店招免费制作 编辑:程序博客网 时间:2024/06/05 07:49
旋转数组的最小数字
- 参与人数:6033时间限制:1秒空间限制:32768K
- 算法知识视频讲解
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
很简单的一道题,不明白牛客网用了什么测试用例,就是通不过。我把自己在VS下写好的代码粘贴出来。这道题有一个隐含的考点,即出现数字相同的情况,而且必须在这种情况的处理代码写出来才能通过。
#include "stdafx.h"#include <vector>using namespace::std;class Solution {public:int minNumberInRotateArray(vector<int> arr) {if (arr.size() == 0) return 0;int head = 0;int tail = arr.size() - 1;int mid = (head + tail) / 2;while (arr[head] >= arr[tail]) {if (tail - head == 1) {return arr[tail];}if (arr[head] == arr[mid] && arr[mid] == arr[tail]) {int result = arr[head];for (int i = head + 1; i <= tail; i++) {result = arr[i] < result ? arr[i] : result;}return result;}if (arr[head] <= arr[mid])head = mid;elsetail = mid;mid = (head + tail) / 2;}return arr[head];}};int _tmain(int argc, _TCHAR* argv[]){vector<int> vec;vec.push_back(1);vec.push_back(0);vec.push_back(1);vec.push_back(1);vec.push_back(1);Solution s;int test = s.minNumberInRotateArray(vec);return 0;}
第二次做:
class Solution {public: int minNumberInRotateArray(vector<int> arr) { if ( arr.empty() ) return 0 ; int first = 0 ; int last = arr.size() - 1 ; int mid = ( first + last ) / 2 ; while ( arr[first] >= arr[last] ) { if ( last - first == 1 ) { return arr[last] ; } if ( arr[first] == arr[last] && arr[first] == arr[mid] ) { int min = arr[first] ; for ( int i = first; i < last; ++ i ) { if ( min > arr[i] ) min = arr[i] ; } return min ; } if ( arr[mid] >= arr[first] ) { first = mid ; } else { last = mid ; } mid = ( first + last ) / 2 ; } return 0 ; }};
第三次做:
class Solution {public: int minNumberInRotateArray(vector<int> arr) { if ( arr.empty() ) return 0 ; int first = 0 ; int last = arr.size() - 1 ; int mid = ( first + last ) / 2 ; while ( arr[first] >= arr[last] ) { if ( last - first == 1 ) return arr[last] ; if ( arr[first] == arr[last] && arr[first] == arr[mid] ) { int min = arr[first] ; for ( int i = first; i < last; ++ i ) { if ( min > arr[i] ) min = arr[i] ; } return min ; } if ( arr[first] <= arr[mid] ) first = mid ; else last = mid ; mid = ( first + last ) / 2 ; } return 0 ; }};
0 0
- 6.旋转数组的最小数字(做第二遍时感觉仍有有难度)
- 10.数值的整数次方(做第二遍时感觉仍有难度,第三次做就没有难度了)
- 2.替换空格(做第二遍时感觉仍有有难度,第三次做就没有难度了)
- 14.合并两个排序的链表(做第二遍时感觉仍有难度,做到第三遍的时候就感觉没有难度了)
- 15.树的子结构(做第二遍时感觉仍有难度,做第三遍时仍然要看思路)
- 19.栈的压入、弹出序列(做第二遍时感觉仍有难度,做第三次时依然需要看思路,但是已经觉得简单了)
- 21.二叉搜索树的后序遍历序列(做第二遍时感觉仍有难度,第三次做时还是要看思路)
- 22.复杂链表的复制(做第二遍时感觉仍有难度,第三次做还是要看思路)
- 23.二叉树中和为某一值的路径(做第二遍时感觉仍有难度,第三次做还是要看一下思路)
- 4.重建二叉树(做第二遍时感觉仍有有难度,第三次做还是要看一下思路才行)
- 24.二叉搜索树与双向链表(做第二遍时感觉仍有难度,做第三遍时还需要看下思路)
- [剑指Offer] 6.旋转数组的最小数字(二分法)
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- 旋转数组的最小数字
- kafka安装
- hiho 53 连通性二·边的双连通分量
- Linux内核中的 struct class 简介
- 动态规划:入门绝佳资料
- const学习
- 6.旋转数组的最小数字(做第二遍时感觉仍有有难度)
- 86-中间代码opcode的执行
- 剑指offer(50):计算1+2+...+n
- 87-代码的加密与解密
- 88-zend_execute的具体执行过程
- opencv、matlab查看函数的定义、封装
- STM32之USART串口接收数据处理
- vs 2015卸载
- 运行VS2010出现无效的许可证数据