力扣学习day7

1.学习目标

1.按照如下类型来刷题:数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
2.动手用多种语言来进行写题,并要有自己的代码模板。
3.总结程序员简历技巧。

学习网址


2.数组

2.1 题目

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:

输入:target = 4, nums = [1,4,4]
输出:1
示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105

进阶:

如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

2.2 暴力法

很容易想到两重循环,外循环控制连续子数组首位下标,内循环负责累加,以及记录当前数组的长度。

每轮内循环与target进行判断,如果是大于就结束内循环,并和最小数组的长度进行比较,如果小于就进行更新。如果是小于就继续,直到内循环遍历到最后一位,如果此时依旧小于target,则直接结束外循环,否则继续。

然后不断移动连续数组首位的下标,直到外循环结束。然后返回最小数组长度即可。

时间复杂度为O(n^2),空间复杂度为O(1)。

稍微做点优化,如果某个数大于target直接返回1。

2.3 滑动窗口

虽然写着滑动窗口,但本质上就是双指针的一个特殊应用,而且不训练的话也难想到,即使想到有时也很难动笔写出来,至少最初的我就是这么想的。

(1)“滑动”与“窗口”

个人理解:
我是这么思考的,所谓的窗口表示的使用两个指针之间的数组。滑动,表示的是这个数组会随指针的移动而“滑动”。

(2)实现方法

用我自己的语言来描述,先构成一个“合格”的窗口,合格的窗口要求两指针间的数组之和大于target。

“滑动”的原则:如果窗口内数组之和大于target则移动左指针以缩小数组和,否则就移动右指针来增加窗口中数组和。

每次达到“合格”状态的时候,就记录当前的长度,并且与最小长度进行对比,如果更小则进行更新,否则继续。

直到最后,右指针到达最右端,且滑动窗口中数组之和小于target,那么就结束循环,此时的最小长度是输出值。

时间复杂度:O(n)
空间复杂度:O(1)

(3)模板

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0; // 滑动窗口数值之和
        int i = 0; // 滑动窗口起始位置
        int subLength = 0; // 滑动窗口的长度
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            // 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
            while (sum >= s) {
                subLength = (j - i + 1); // 取子序列的长度
                result = result < subLength ? result : subLength;
                sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

3. 数组2

3.1题目

题目59.螺旋矩阵II

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

3.2思考

这道题没有什么算法,但对严谨性有极大的要求,有一种一看就会一写就跪的感觉。

我的思路十分的简单,就是设置四角坐标,然后四种方向的画矩阵,但实际做的时候还是会有很多的细节要处理,暂时先看下别人大佬的处理方法吧。

https://mp.weixin.qq.com/s/KTPhaeqxbMK9CxHUUgFDmg

据说,面试会经常考这道题目,我还是仔细的研究一下吧!!!!

4. 闲聊

投了简历,模拟了一轮行测,刷了下题目,等待了下初试成绩,一天就这么没了。我螺旋矩阵还是自己在钻研一下吧,感觉细节挺多的,昨天自己还写了下二分查找的思考,感觉仔细思考问题还真的收获不少。

今天算是把数组篇简单的过了下,明天开始链表吧,其实我还想把排序算法以及多线程复习一下的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此人受打击,决定去力扣历练

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值