长度最小的子数组(209)
暴力解法(python)
def ss(nums,sum):
min_len = float('inf')
for i in range (len(nums)):
s = 0
for j in range(i,len(nums)):
s += nums[j]
if s >= sum:
min_len = min(min_len,j-i+1)
break
return min_len
if __name__ == "__main__":
nums = [2,3,1,2,4,3,7]
sum = 7
print(ss(nums,sum))
滑动窗口法 (python)
def ss(nums,sum):
i = 0 #i指向起始位置
result = float("inf")
s = 0
for j in range(len(nums)): #j指向的是终止位置
s += nums[j]
while(s >= sum): #注意此处用while而不用if,因为是一个持续移动的过程
result = min(result, j-i+1)
s -= nums[i]
i += 1
return result
if __name__ == "__main__":
nums = [2,3,1,2,4,3]
sum = 7
print(ss(nums,sum))
滑动窗口法 (C++)
#include <iostream>
#include <vector>
using namespace std;
int ss(vector <int> &nums,int sum) {
int i = 0;
int k = INT_MAX; //表示C++中整型的最大值
int s = 0;
for (int j = 0;j < nums.size();j++) {
s += nums[j];
while (s >= sum) {
k = min(k, j - i + 1);
s -= nums[i];
i++;
}
}
return k;
}
int main() {
vector <int>nums;
int arr[6] = { 2,3,1,2,4,3};
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0;i < n;i++) {
nums.push_back(arr[i]);
}
int sum = 7;
cout << ss(nums,sum) << endl;
}
水果成篮 (904)
from collections import Counter #python
def totalFruit(fruits) -> int:
cnt = Counter()
j = 0
for x in fruits:
cnt[x] += 1 #记录果篮中水果数量的字典
if len(cnt) > 2: #果篮里水果种类如果大于2
y = fruits[j]
cnt[y] -= 1 #j是超出两种水果后,需要通过右移去掉超出两种之外水果的指针
if cnt[y] == 0:
cnt.pop(y) #cnt[y]对应的值为0时,会自动排到字典尾部,等待pop删除(弹出)
j += 1
return len(fruits) - j #返回采摘的水果最大个数
if __name__ == "__main__":
nums = [2,3,1,2,2,3]
print(totalFruit(nums))
#include <iostream> //C++
#include <vector>
#include<unordered_map> //哈希表
#include<algorithm> //max()函数
using namespace std;
int totalFruit(vector <int>& nums) {
// 窗口长度、起始指针、当前果树种类计数
int wl = 0, i = 0, cnt = 0, len = nums.size();
// 果篮
unordered_map<int, int> basket;
for (int j = 0;j < len;++j) {
// 更新cnt
if (basket[nums[j]] == 0)cnt++;
basket[nums[j]]++;
// 不满足cnt≤2则保守地后移起始指针,一旦满足条件就停止移动
while (cnt > 2) {
basket[nums[i]]--;
if (basket[nums[i]] == 0)cnt--;
i++;
}
// 一旦满足条件就更新result
wl = max(wl, j - i + 1);
}
return wl;
}
int main() {
vector <int>nums;
int arr[6] = { 2,3,1,2,2,3};
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0;i < n;i++) {
nums.push_back(arr[i]);
}
cout << totalFruit(nums) << endl;
}
注意事项和错误记录
- 滑动窗口法和双指针法都是利用两个指针移动来破解题目,但是注意本题的滑动窗口解法中,j是指向终止位置的,当结果符合题目要求(即s>=sum)时,开始移动指向初始位置的指针i。
- C++如何表示无限大?借助limits.h库,里面定义了各种数据类型的最大值。部分数据类型及其对应的最大值如下:
int->INT_MAX
unsigned int ->UINT_MAX
long->LONG_MAX
unsigned long->ULONG_MAX - Counter() 是 collections 库中的一个函数,可以用来统计一个 python 列表、字符串、元组等可迭代对象中每个元素出现的次数,并返回一个字典。
个人刷题记录整理,欢迎随时纠错和讨论!