文章目录
- 1、 旋转数组的最小数字
- 2、调整数组顺序使奇数位于偶数前面
- 3、二维数组中的查找
1、 旋转数组的最小数字
本题考点:核心考点:数组理解,二分查找,临界条件 牛客链接
题目描述:
有一个长度为 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<int> rotateArray) {
int left = 0, rigth = rotateArray.size() - 1;
// 循环
while (left < rigth) {
// 找到数组的中点 m
int 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];
}
};
2、调整数组顺序使奇数位于偶数前面
本题考点:数组操作,排序思想的扩展使用 牛客链接
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
图解:
代码:
class Solution {
public:
void reOrderArray(vector<int> &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;
}
}
}
};
3、二维数组中的查找
本题考点:数组相关,特性观察,时间复杂度把握牛客链接
题目描述:
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
数据范围:矩阵的长宽满足5000≤n,m≤500 , 矩阵中的值满足0≤val≤10^9
进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)
图解:
代码:
class Solution {
public:
bool Find(int target, vector<vector<int> > 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;
}
};