22.旋转数组的最小数字
个人AC代码
思路有些复杂,而且中间的很多错误都是在调试中改过来的。
今日完成:
注:最后一题的机器人是BFS类问题,里面有需要求一个数字每一位和的步骤。
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==0) return -1;
int left=0;
int right=nums.size()-1;
int mid;
while(left<right){
mid=(left+right)/2;
//x>y<z
if(nums[mid]<=nums[mid+1]&&nums[mid]<nums[mid-1])
return nums[mid];
//x<y<z
else if(nums[mid]>=nums[mid-1]&&nums[mid]<=nums[mid+1]){
if(nums[mid]<=nums[nums.size()-1]) right=mid-1;
else left=mid+1;
}
//x<y>z
else if(nums[mid]>=nums[mid-1]&&nums[mid]>=nums[mid+1]){
if(nums[mid]>=nums[left]) left=mid+1;
else right=mid-1;
}
}
return nums[left];
}
};
标准AC代码:
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size() - 1;
if (n < 0) return -1;
//对类似于34512333这样的首尾连续的情况进行预处理
while (n > 0 && nums[n] == nums[0]) n -- ;
//类似于34533这种,预处理后就是345或333这种,预处理就 是3
if (nums[n] >= nums[0]) return nums[0];
int l = 0, r = n;
while (l < r) {
int mid = l + r >> 1; // [l, mid], [mid + 1, r]
//仅需要将mid的值和nums[0]进行比较
if (nums[mid] < nums[0]) r = mid;//小,则说明应当向前寻找,修改右边界
else l = mid + 1;//大,则说明应当向后寻找,修改左边界
}
return nums[r];
}
};
23.矩阵中的路径
思路:DFS的应用
心得:模板题目,还是不太熟练,第一遍做的时候不会的地方在于退出的条件、如何遍历4个方向、什么时候更新状态、遍历完后如果没有找到下条路就要回退的时候在哪里恢复状态。
class Solution {
int s[1000][1000];
public:
bool DFS(vector<vector<char>>& matrix,int x,int y,int index,string &str){
//先写退出的条件
if(matrix[x][y]!=str[index]) return false;
if(index==str.length()-1) return true;
//修改状态
s[x][y]=1;
//开始继续搜索,上、下、左、右
int w1[4]={-1,1,0,0};
int w2[4]={0,0,-1,1};
for(int i=0;i<4;i++){
int newx=x+w1[i];
int newy=y+w2[i];
if(newx>=0&&newx<matrix.size()&&newy>=0&&newy<matrix[0].size()&&s[newx][newy]==0){
if(DFS(matrix,newx,newy,index+1,str))
return true;
}
}
s[x][y]=0;//回退状态
return false;
}
bool hasPath(vector<vector<char>>& matrix, string &str) {
int line=matrix.size();
if(line==0) return false;
int col=matrix[0].size();
if(col==0) return false;
for(int i=0;i<line;i++){
for(int j=0;j<col;j++){
memset(s,0,sizeof(s));
if(DFS(matrix,i,j,0,str)) return true;
}
}
return false;
}
};