精品推荐:
《征服数据结构》专栏:50多种数据结构彻底征服
《经典图论算法》专栏:50多种经典图论算法全部掌握
有的人一找不到工作就自怨自艾,怨天尤人,一度怀疑自己,甚至破罐破摔,自甘堕落,有的甚至为此感到焦虑,导致最后发展成了抑郁症。实际上找不到工作并不都是你的错,而是人家已经招满了,还在继续招主要是给公司做宣传,所以这个时候你怎么可能过,就算是爱因斯坦来了一样收不到offer。下面一位网友透露出了校招的实情,原来都是套路。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第209题:长度最小的子数组。
问题描述
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
输入:target = 4, nums = [1,4,4]
输出:1
1 <= target <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^5
问题分析
public int minSubArrayLen(int target, int[] nums) {
int left = 0, right = 0;// 窗口的左右边界
int min = Integer.MAX_VALUE;// 满足条件的最小窗口长度
while (right < nums.length) {
target -= nums[right++];// 滑动窗口右边界
// 如果窗口满足条件就缩小窗口,移除窗口左边界元素,直到窗口
// 不满足条件为止,顺便记录下满足条件的窗口最小长度。
while (target <= 0) {
min = Math.min(min, right - left);
target += nums[left++];// 移除左边界
}
}
return min == Integer.MAX_VALUE ? 0 : min;
}
public:
int minSubArrayLen(int target, vector<int> &nums) {
int left = 0, right = 0;// 窗口的左右边界
int minLen = INT_MAX;// 满足条件的最小窗口长度
while (right < nums.size()) {
target -= nums[right++];// 滑动窗口右边界
// 如果窗口满足条件就缩小窗口,移除窗口左边界元素,直到窗口
// 不满足条件为止,顺便记录下满足条件的窗口最小长度。
while (target <= 0) {
minLen = min(minLen, right - left);
target += nums[left++];// 移除左边界
}
}
return minLen == INT_MAX ? 0 : minLen;
}
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left, right = 0, 0 # 窗口的左右边界
minLen = 2 ** 31 # 满足条件的最小窗口长度
while right < len(nums):
target -= nums[right] # 滑动窗口右边界
right += 1
# 如果窗口满足条件就缩小窗口,移除窗口左边界元素,直到窗口
# 不满足条件为止,顺便记录下满足条件的窗口最小长度。
while target <= 0:
minLen = min(minLen, right - left)
target += nums[left] # 移除左边界
left += 1
return 0 if minLen == 2 ** 31 else minLen
数组,稀疏表(Sparse Table),单向链表,双向链表,块状链表,跳表,队列和循环队列,双端队列,单调队列,栈,单调栈,双端栈,散列表,堆,字典树(Trie树),ArrayMap,SparseArray,二叉树,二叉搜索树(BST),笛卡尔树,AVL树,树堆(Treap),FHQ-Treap,哈夫曼树,滚动数组,差分数组,LRU缓存,LFU缓存
……
图的介绍,图的表示方式,邻接矩阵转换,广度优先搜索(BFS),深度优先搜索(DFS),A*搜索算法,迭代深化深度优先搜索(IDDFS),IDA*算法,双向广度优先搜索,迪杰斯特拉算法(Dijkstra),贝尔曼-福特算法(Bellman-Ford),SPFA算法,弗洛伊德算法(Floyd),卡恩(Kahn)算法,基于DFS的拓扑排序,约翰逊算法(Johnson)
……