74. 搜索二维矩阵
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int row = matrix.size();
int col = matrix[0].size();
for(int i=0;i<row;i++) {
//先排除一下不存在的情况
if(i>0&&matrix[i][0]>target && matrix[i-1][col-1]<target)
return false;
//锁定某一行之后使用二分查找
if(matrix[i][0] <=target && matrix[i][col-1]>=target) {
int begin=0,end=col-1;
while(begin<=end) {
int mid = begin + (end-begin)/2;
if(matrix[i][mid] > target) {
end = mid-1;
}
else if(matrix[i][mid] < target) {
begin = mid+1;
}
if(matrix[i][mid]==target)
return true;
}
}
}
return false;
}
};
33. 搜索旋转排序数组
二分法,稍微区分了一下左侧有序还是右侧有序
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()==0)
return -1;
if(nums.size()==1)
return nums[0]==target?0:-1;
int left = 0, right = nums.size()-1;
while(left<=right) {
int mid = left+(right-left)/2;
if(nums[mid]==target)
return mid;
else if(nums[0] <= nums[mid]) {
if(nums[0] <=target && target < nums[mid])
right = mid-1;
else
left = mid+1;
}
else {
if(nums[mid] <target && target <= nums[nums.size()-1])
left = mid+1;
else
right = mid-1;
}
}
return -1;
}
};
153. 寻找旋转排序数组中的最小值
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==1)
return nums[0];
int n = nums.size()-1;
int left = -1,right = n;
int res = nums[0];
if(nums[0] < nums[n])
return res;
while(left+1<right) {
int mid = left+(right-left)/2;
if(nums[mid] < nums.back())
right = mid;
else
left = mid;
}
return nums[right];
}
};
98. 验证二叉搜索树
通过中序遍历,得到有序的数组,在判断数组是否严格递增
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void traversal(TreeNode* root,vector<int>& res) {
if(root==NULL)
return;
if(root->left)
traversal(root->left,res);
res.push_back(root->val);
if(root->right)
traversal(root->right,res);
}
bool isValidBST(TreeNode* root) {
if(!root)
return true;
vector<int> res;
traversal(root,res);
for(int i=1;i<res.size();i++) {
if(res[i] <= res[i-1])
return false;
}
return true;
}
};
118. 杨辉三角
res即dp数组,寻找res[i][j]的更新规律
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> res(numRows);
for(int i=0;i<numRows;i++) {
res[i].resize(i+1);
res[i][0] = res[i][i] = 1;
for(int j=1;j<i;j++) {
res[i][j] = res[i-1][j]+res[i-1][j-1];
}
}
return res;
}
};