【数组】长度最小的子数组

题目链接:长度最小的子数组
关键点:
【1】满足最小子数组之和小于等于给定值;
【2】最小子数组不存在时返回0。
思路:
暴力解法:先假设最终最小子数组的长度为INT_MAX,然后直接2个for循环嵌套遍历,第一for循环作为最小子数组的起点,第二个用来遍历最小子数组,当满足最小子数组之和大于等于给定值时,与最终最小子数组长度进行比较,若小于,就认为此时最小子数组长度为最终最小数组长度。
滑动窗口法:将最小子数组看做是一个窗口,用两个指针最为窗口左右边界,移动这两个指针可以改变窗口的长度,找到满足条件的最小窗口。
1)暴力解法

#include 
#include 

class Solution
{
public:
	int minSubArrayLen(std::vector<int>& nums, int target)
	{
		int sum = 0;								// 子数组之和
		int shortlength = INT_MAX;					// 最短的子数组长度,初始大小假设为INT_MAX
		int subLength = 0;							// 子数组长度
		for (int i = 0; i < nums.size(); ++i)		// 子数组开始位置
		{
			sum = 0;								// 每个子数组遍历之前,总和先置为0
			for (int j = i; j < nums.size(); ++j)	// 遍历子数组
			{
				sum += nums[j];						// 计算子数组总和
				if (sum >= target)						// 满足子数组总和大于等于给定值
				{	
					subLength = j - i + 1;			// 更新子数组长度
					if (shortlength > subLength)	// 如果子数组长度比最短子数组长度还小
					{
						shortlength = subLength;	// 将子数组长度赋值给最短子数组长度
					}
					break;							// 一旦子数组满足条件,就停止本次遍历
				}
			}
		}
		return shortlength == INT_MAX ? 0 : shortlength; // 判断子数组是否存在,不存在返回0
	}
};



int main()
{
	std::vector<int> nums = { 2,3,1,2,4,3 };

	Solution s;
	int ret = s.minSubArrayLen(nums, 7);
	std::cout << ret << std::endl;
	return 0;
}

2)滑动窗口法

#include 
#include 

class Solution
{
public:
	int minSubArrayLen(std::vector<int>& nums, int target)
	{
		int sum = 0;									// 窗口元素之和
		int shortlength = INT_MAX;						// 最小窗口长度,初始大小假设为INT_MAX
		int startpos = 0;								// 窗口开始位置
		int sublength = 0;								// 窗口长度
		for (unsigned int endpos = 0; endpos < nums.size(); endpos++)	// 窗口的结束位置
		{
			sum += nums[endpos];						// 窗口元素之和
			while (sum >= target)						// 当窗口元素之和大于给定值
			{
				sublength = endpos - startpos + 1;		// 更新窗口长度
				if (sublength < shortlength)			// 如果窗口长度小于最小窗口长度
				{
					shortlength = sublength;			// 窗口长度作为最小窗口长度
				}
				sum -= nums[startpos++];				// 更新窗口的开始位置
			}
		}
		
		return shortlength == INT_MAX ? 0 : shortlength; // 判断子数组是否存在,不存在返回0
	}
};



int main()
{
	std::vector<int> nums = { 2,3,1,2,4,3 };

	Solution s;
	int ret = s.minSubArrayLen(nums, 7);
	std::cout << ret << std::endl;
	return 0;
}

你可能感兴趣的:(LeetCode,c++,算法,leetcode)