1、二维数组中的查找
从左下角开始查找。算法复杂度O(n+m),从横纵来看都只进行了一次遍历。
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0) return false;
int n=matrix.size()-1,m=matrix[0].size()-1;
//从左下角开始查找起,坐标为(n,0)
int i=n,j=0;
while(i>=0 && j<=m)
{
if(matrix[i][j]==target) return true;
else if(matrix[i][j]>target) i--;
else j++;
}
return false;
}
};
2、旋转数组的最小数字
有序数组,二分法
class Solution {
public:
int minArray(vector<int>& numbers) {
int left=0,right=numbers.size()-1;
while(left<right)
{
int mid=left+(right-left)/2;
if(numbers[mid]>numbers[mid+1]) return numbers[mid+1];
//说明(mid,right]区间内存在旋转点导致了降序
else if(numbers[mid]>numbers[right]) left=mid+1;
//说明(mid,right]区间内正确升序,旋转点在[left,mid]之间
else if(numbers[mid]<numbers[right]) right=mid;
//不论mid在左半部分或右半部分,right都不可能是跳变区间的右端点
else right--;
}
return numbers[right];
}
};
3、第一个只出现一次的字符
哈希映射
class Solution {
public:
char firstUniqChar(string s) {
unordered_map<char,int> hash;
for(char c : s)
{
hash[c]++;
}
for(char c : s)
{
if(hash[c]==1) return c;
}
return ' ';
}
};