螺旋矩阵
题目
问题分析
模拟循环过程:
上边从左至右、右边从上至下、下边从右至左、左边从下至上,为一圈,规模n时转 n/2 圈
处理边角元素:一圈内遍历四条边,遵循区间不变原则,保证左闭右开
代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int loop = n / 2; int flag = n % 2; int k = n - 1;
int num = 1; cout<<flag;
for(int i = 0; i < loop; i++) {
for(int j = i; j < k - i; j++) {//前闭后开
res[i][j] = num++;
}
for(int j = i; j < k - i; j++) {
res[j][n - 1 - i] = num++;
}
for(int j = k - i; j > i; j--) {
res[n - 1 - i][j] = num++;
}
for(int j = k - i; j > i; j--) {
res[j][i] = num++;
}
}
if(flag == 1) res[n/2][n/2] = num++;
return res;
}
};
滑动窗口
题目
问题分析
暴力解法:设定起始位置 i,终止位置 j,固定开端,移动结尾。
滑动窗口:设置终止位置,移动起始位置
移动时机:区间内已满足/不满足条件时。例如:209题中,区间已满足和条件时可移动,找最小长度;904题中水果种类超出时要移动,保证满足篮子数量限制。
代码
209.长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int length = nums.size(); int sum = 0;
int flag = 0;//整个数组加起来不满足条件
int i, j = 0;
for(i = 0; i < nums.size(); i++) {
sum += nums[i];
while(sum >= target) {
flag = 1;
length = length > (i - j + 1)? (i - j + 1): length;
sum -= nums[j++]; //判断移动后是否还满足条件
}
}
if(flag == 0) return 0;
return length;
}
};
904. 水果成篮
注意一下如何记录【种类】,以及如何判断某类已全部移出(数量记录)
//用哈希表记录<种类,数量>
class Solution {
public:
int totalFruit(vector<int>& fr) {
int i = 0, j = 0;
int cnt = 0; int res = 0;
unordered_map<int,int> basket; //篮子编号,水果数量
for(int i = 0; i < fr.size(); i++) {
if(basket[fr[i]] == 0) //第一次出现
cnt++;
basket[fr[i]]++;
//cout<<cnt<<endl;
while(cnt > 2) {
basket[fr[j]]--;
if(basket[fr[j]] == 0)cnt--;
j++;
}
res = res > (i - j + 1)? res: (i - j + 1);
}
return res;
}
};
//用数组记录,下标为种类,值为数量
class Solution {
public:
int totalFruit(vector<int>& fr) {
int i = 0, j = 0;
int cnt = 0; int res = 0;
vector<int> frNums(fr.size()+10,0);
for(i = 0; i < fr.size(); i++) {
if(frNums[fr[i]] == 0) cnt++;
frNums[fr[i]]++;
while(cnt > 2) {
frNums[fr[j]]--;
if(frNums[fr[j]] == 0) cnt--;
j++;
}
res = res > (i - j + 1)? res: (i - j + 1);
}
return res;
}
};
整数逆置的方法
题目
代码
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0) return false;
if(x == 0) return true;
int a = x;
long b = 0;
while(a) {
b = a % 10 + b * 10;
a /= 10;
}
return b == x;
}
};