本题考点:核心考点:数组理解,二分查找,临界条件 牛客链接
题目描述:
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1≤n≤10000,数组中任意元素的值:100000≤val≤10000
要求:空间复杂度:O(1) ,时间复杂度:O(logn)
图解:
代码:
class Solution {
public:int minNumberInRotateArray(vector rotateArray) {int left = 0, rigth = rotateArray.size() - 1;// 循环while (left < rigth) {// 找到数组的中点 mint m = (left + rigth) / 2;// m在左排序数组中,旋转点在 [m+1, j] 中if (rotateArray[m] > rotateArray[rigth]) left = m + 1;// m 在右排序数组中,旋转点在 [i, m]中else if (rotateArray[m] < rotateArray[rigth]) rigth = m;// 缩小范围继续判断else rigth--;}// 返回旋转点return rotateArray[rigth];}
};
本题考点:数组操作,排序思想的扩展使用 牛客链接
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
图解:
代码:
class Solution {
public:void reOrderArray(vector &array) {int place = 0; //奇数要插入的位置for(int i = 0; i < array.size(); i++){if(array[i] & 1){int temp = array[i];int j = i;while(j > place){array[j] = array[j - 1];j--;}array[place++] = temp;}}}
};
本题考点:数组相关,特性观察,时间复杂度把握牛客链接
题目描述:
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
数据范围:矩阵的长宽满足5000≤n,m≤500 , 矩阵中的值满足0≤val≤10^9
进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)
图解:
代码:
class Solution {
public:bool Find(int target, vector > array) {int ROW = 0, COL = array[0].size() - 1;while(ROW < array.size() && COL >= 0){if(array[ROW][COL] > target){COL--;}else if(array[ROW][COL] < target){ROW++;}else{return true;}}return false;}
};