刷题日记 DAY2
数组
leetcode 209 长度最小的子数组
暴力
把所有子数组的和等于target的求一遍然后取其长度最小值
int minSubArrayLen(int target, vector<int>& nums) {
int lenth = nums.size();
int min = __INT_MAX__;
for(int i = 0; i < lenth; ++i) {
int sum = 0;
int count = 0;
for(int j = i; j < lenth; ++j) {
sum += nums[j];
count++;
if(target <= sum) {
if(count < min)
min = count;
}
}
}
return min == __INT_MAX__ ? 0 : min;
}
双指针(滑动窗口)
使用一个left指向窗口的左边界,一个right指针指向窗口的右边届,在一次循环中先将right指针不断右移增加窗口尺寸,并计算出窗口的值。当窗口的值大于等于target的值时,开始逐渐向右移动left指针不断减小窗口的尺寸,直到窗口的值不小于target,此时窗口的大小就是最小的长度值。
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int lenth = nums.size();
int sublenth = 0;
int sum = 0;
int min = __INT_MAX__;
for (int right = left; right < lenth; ++right) {
sum += nums[right];
while (sum >= target) {
sublenth = right - left + 1;
if (sublenth <= min) {
min = sublenth;
}
sum -= nums[left++];
}
}
return min == __INT_MAX__ ? 0 : min;
}
leetcode 59 螺旋矩阵II
相当于将矩阵拆成一个绕圈的一维数组,每次遍历完一行(列)就会拆掉一行(列)。
vector< vector<int> > generateMatrix(int n) {
vector< vector<int> > res(n, vector<int>(n, 0));
int lb = 0;
int rb = n - 1;
int ub = 0;
int db = n - 1;
int num = 1;
while(num <= n * n) {
/*左到右*/
for(int i = lb; i <= rb; ++i) {
res[ub][i] = num++;
}
ub++;
/*上到下*/
for(int i = ub; i <= db; ++i) {
res[i][rb] = num++;
}
rb--;
/*右到左*/
for(int i = rb; i >= lb; --i) {
res[db][i] = num++;
}
db--;
/*下到上*/
for(int i = db; i >= ub; --i) {
res[i][lb] = num++;
}
lb++;
}
return res;
}