代码随想录day2 数组总结
1.二分查找
2.快慢 双指针
代码随想录day1-CSDN博客
3.滑动窗口
滑动窗口就是有一个起始位置,一个终止位置,通过调节起始位置和终止位置得到我们想要的结果。
外面一层for循环 用来更新终止位置 不满足条件 终止位置右移
里面一层while循环 用来更新起始位置 满足条件 起始位置右移
209. 长度最小的子数组 - 力扣(LeetCode)
int minSubArrayLen(int target, vector<int>& nums) {
int i = 0;
int reslut = 100001;
int subL = 0;
int sum = 0;
for(int j = 0; j < nums.size(); j++){
sum += nums[j];
while(sum >= target){
subL = j - i + 1;
reslut = min(reslut, subL);
sum -= nums[i];
i++;
}
}
if(reslut == 100001)return 0;
else return reslut;
}
904. 水果成篮 - 力扣(LeetCode)
int totalFruit(vector<int>& fruits) {
int i = 0;
int result = 0;
unordered_map<int, int> kind; //记录水果种类数
for(int j = 0; j < fruits.size(); j++){
kind[fruits[j]]++;
while(kind.size() > 2){
kind[fruits[i]]--;
if(kind[fruits[i]] == 0){
kind.erase(fruits[i]); //如果某种水果数量等于0,从哈希表中移除
}
i++;
}
result = max(result, j - i + 1);
}
return result;
}
76. 最小覆盖子串 - 力扣(LeetCode)
string minWindow(string s, string t) {
if(s.empty() || t.empty() || s.size() < t.size())return "";
int result = INT_MAX;
int i = 0;
unordered_map<char, int>t_count;
unordered_map<char, int> window_count;
for(int j = 0; j < t.size(); j++){
t_count[t[j]]++;
}
int num = 0;
int left = 0;
for(int j = 0; j < s.size(); j++){
window_count[s[j]]++;
if(window_count[s[j]] == t_count[s[j]]){
num++;
}
while(num == t_count.size()){
int temp = j - i + 1;
if(temp < result){
result = temp;
left = i;
}
if(t_count.find(s[i]) != t_count.end()){
if(window_count[s[i]] == t_count[s[i]]){
num--;
}//本来有可能大于或等于
window_count[s[i]]--;
}
i++;
}
}
return result == INT_MAX ? "":s.substr(left, result);
}
4.螺旋矩阵模拟
左闭右开,循环模拟
59. 螺旋矩阵 II - 力扣(LeetCode)
vector<vector<int>> generateMatrix(int n) {
int starx = 0, stary = 0;
int offset = 1;
vector<vector<int>> re(n, vector<int>(n,0));
int count = 1;
int i, j;
while(offset <= n/2){
i = starx;
j = stary;
for(; j < n - offset; j++){
re[i][j] = count++;
}
for(; i < n - offset; i++){
re[i][j] = count++;
}
for(; j > stary; j--){
re[i][j] = count++;
}
for(; i > starx; i--){
re[i][j] = count++;
}
offset++;
starx++;
stary++;
}
if(n % 2 != 0)re[n/2][n/2] = count;
return re;
}
54. 螺旋矩阵 - 力扣(LeetCode)
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0)return {};
vector<int> re;
int starx = 0, stary = 0;
int w = matrix[0].size();
int h = matrix.size();
int i, j;
int offset = 1;
while(offset <= min(w,h)/2){
i = starx;
j = stary;
for(; j < w - offset; j++){
re.push_back(matrix[i][j]);
}
for(;i < h - offset; i++){
re.push_back(matrix[i][j]);
}
for(; j > stary; j--){
re.push_back(matrix[i][j]);
}
for(; i > starx; i--){
re.push_back(matrix[i][j]);
}
offset++;
starx++;
stary++;
}
if(h % 2 != 0 && w >= h){
int offset = h/2;
for(int j = offset; j < w - offset; j++){
re.push_back(matrix[offset][j]);
}
}else if(w % 2 != 0 && w < h){
int offset = w/2;
for(int i = offset; i < h - offset; i++){
re.push_back(matrix[i][offset]);
}
}
return re;
}
5.区间和
把前缀和保存起来后面直接用
58. 区间和(第九期模拟笔试)
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n, a, b;
cin >> n;
int re = 0;
vector<int> vec(n);
vector<int> sum(n); // 前缀和
for(int i = 0; i < n; i++){
int t;
cin >> t;
vec[i] = t;
if(i == 0)sum[i] = t;
else sum[i] = t + sum[i-1];
}
while(cin >> a >> b){
if(a == 0)re = sum[b];
else re = sum[b] - sum[a-1];
cout << re << endl;
}
}
44. 开发商购买土地(第五期模拟笔试)
#include<iostream>
#include<vector>
#include <climits>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
int sum = 0;
vector<vector<int>> vec(n, vector<int>(m, 0));
vector<int> w(n, 0); //横向
vector<int> h(m, 0); //纵向
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
int t = 0;
cin >> vec[i][j];
sum += vec[i][j];
w[i] += vec[i][j];
}
}
for(int j = 0; j < m; j++){
for(int i = 0; i < n; i++){
h[j] += vec[i][j];
}
}
int result = INT_MAX;
int t = 0;
for(int i = 0; i < n; i++){
t += w[i];
result = min(result, abs(sum - t - t));
}
t = 0;
for(int j = 0; j < m; j++){
t += h[j];
result = min(result, abs(sum - t - t));
}
cout << result << endl;
}