刷题DAY4_数组

长度最小的子数组(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;
}

注意事项和错误记录

  1. 滑动窗口法和双指针法都是利用两个指针移动来破解题目,但是注意本题的滑动窗口解法中,j是指向终止位置的,当结果符合题目要求(即s>=sum)时,开始移动指向初始位置的指针i。
  2. C++如何表示无限大?借助limits.h库,里面定义了各种数据类型的最大值。部分数据类型及其对应的最大值如下:
    int->INT_MAX
    unsigned int ->UINT_MAX
    long->LONG_MAX
    unsigned long->ULONG_MAX
  3. Counter() 是 collections 库中的一个函数,可以用来统计一个 python 列表、字符串、元组等可迭代对象中每个元素出现的次数,并返回一个字典。

个人刷题记录整理,欢迎随时纠错和讨论!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值