代码随想录刷题题Day2

刷题的第二天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++ / Python
Day2 任务
977.有序数组的平方
209.长度最小的子数组
59.螺旋矩阵 II

1 有序数组的平方(重点:双指针思想

在这里插入图片描述

1.1 暴力

思路:将数组里面所有元素平方,再排序。
时间复杂度: O ( n + n l o g n ) O(n + nlogn) O(n+nlogn)
C++:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
		for (int i = 0; i < nums.size(); i++)
		{
			nums[i] *= nums[i];
		}
		sort(nums.begin(), nums.end());
		return nums;
    }
};

Python:

class Solution(object):
    def sortedSquares(self, nums):
        for i in range(len(nums)):
            nums[i] *= nums[i]
        nums.sort()
        return nums
1.2 双指针(非常重要的思想)

在这里插入图片描述
非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序
数组里面的元素平方之后,元素趋势如下图所示
在这里插入图片描述
数组平方的最大值就在数组的两端,考虑双指针,i指向起始位置,j指向终止位置
伪代码:

vector<int> result;
k = nums.size - 1;
for(i = 0, j = nums.size-1;i<=j;) # i <= j,因为最后要处理两个元素
    if(nums[i]*nums[i]>nums[j]*nums[j])
        result[k--] = nums[i]*nums[i]
        i++
    else
        result[k--] = nums[j]*nums[j]
        j--
return result

时间复杂度: O ( n ) O(n) O(n)
C++:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
		int k = nums.size() - 1;
        vector<int> result(nums.size(), 0);
        for (int i = 0, j = nums.size() - 1; i <= j; )
        {
            if (nums[i] * nums[i] > nums[j] * nums[j])
            {
                result[k--] = nums[i] * nums[i];
                i++;
            }
            else
            {
                result[k--] = nums[j] * nums[j];
                j--;
            }
        }
        return result;
    }
};

Python:

class Solution(object):
    def sortedSquares(self, nums):
        i,j,k = 0, len(nums) - 1, len(nums) - 1
        res = [float('inf')] * len(nums)
        while i <= j:
            if nums[i] ** 2 > nums[j] ** 2:
                res[k] = nums[i] ** 2
                i += 1
            else:
                res[k] = nums[j] ** 2
                j -= 1
            k -= 1
        return res

2 长度最小的子数组 - (滑动窗口

在这里插入图片描述

2.1 暴力解法

两个for循环,不断寻找符合条件的子序列
更新起始位置,终止位置每次都是一直往后遍历
时间复杂度: O ( n 2 ) O(n^2) O(n2)
C++:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
		int res = INT32_MAX;// 2147483647
        int sum = 0;// 子序列数值之和
        int subLength = 0;// 子序列的长度
        for (int i = 0; i < nums.size(); i++) // 起点i
        {
            sum = 0;
            for (int j = i; j < nums.size(); j++) // 终止位置j
            {
                sum += nums[j];
                if (sum >= target) // 子序列和超过了s,更新result
                {
                    subLength = j - i + 1; // 子序列的长度
                    res = res < subLength ? res : subLength;
                    break;
                }
            }
        }
        return res == INT32_MAX ? 0 : res;
    }
};
2.2 滑动窗口解法

在这里插入图片描述

时间复杂度 O ( n ) O(n) O(n)
滑动窗口:不断的调节子序列的起始位置和终止位置,得出想要的结果
用一个for循环来做2个for循环所做的事情

索引下标j表示的是滑动窗口里面的终止位置
假设是起始位置,for循环一次一次往后移动,这个终止位置要把后面所有的元素都遍历一遍,这种就和暴力解法没有区别。
因此,这个for循环里面的j一定指向的是终止位置,而起始位置需要用动态移动(滑动窗口的精髓)的策略来移动起始位置。

解题关键:移动窗口的起始位置
终止位置随着for循环一个一个向后移动,集合里的元素之和sum>=target时,说明这个集合满足条件,收集这个集合的长度,起始位置就可以移动了。
就是当我们发现集合里面所有的元素和 >= target,我们再去移动起始位置,这样就实现了动态调整起始位置,来去收集不同长度区间里面的和

❗应该写if(sum >= target)还是 while(sum >= target)
输入:target = 100, nums = [1,1,1,1,1,100]
如果是if,那么会漏掉其他情况

C++:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
		int res = INT32_MAX; // 2147483647
		int i = 0; // 起始位置
		int sum = 0; // 子序列的和
		int subLength = 0; // 子序列的长度
		for (int j = 0; j < nums.size(); j++) // 更新终止位置
		{
			sum += nums[j];
			while (sum >= target) // 动态移动起始位置
			{
				subLength = j - i + 1; // 子序列的长度
				res = res < subLength ? res : subLength; // 记录较小的长度
				sum -= nums[i++]; // 移动起始位置i+1
			}
		}
		return res == INT32_MAX ? 0 : res; // 如果等于INT32_MAX,说明没有找到满足条件的子序列
    }
};

时间复杂度是O(n)
for循环里放一个while就认为是 O ( n 2 ) O(n^2) O(n2)是错误的,主要是看每一个元素被操作的次数,每个元素在滑动窗口后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 O ( 2 n ) O(2n) O(2n),也就是 O ( n ) O(n) O(n)

Python:

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        l = len(nums)
        res = float('inf')
        i = 0 # 起始位置
        subLength = 0 # 子序列的长度
        cur_sum = 0 # 子序列和
        j = 0 # 终止位置
        while j < l:
        	cur_sum += nums[j]
        	while cur_sum >= target:
        		subLength = j - i + 1
        		res = min(res, subLength)
        		cur_sum -= nums[i]
        		i += 1
        	j += 1
        return res if res != float('inf') else 0

3 螺旋矩阵

在这里插入图片描述
本题的求解依然要坚持循环不变量原则
坚持每条边左闭右开的原则
在这里插入图片描述
伪代码:

startx = 0;
starty = 0;
offset = 1; # 控制终止位置
count = 1;
while(n/2)
{
	i = startx;
	j = starty;
    for (j = starty; j < n - offset; j++){
        nums[startx][j] = count++;
    }
    for (i = startx; i < n - offset;i++){
        nums[i][j] = count++;
    }
    for (; j > starty; j--){
        nums[i][j] = count++;
    }
    for (; i > startx; i--){
        nums[i][j] = count++;
    }
    startx++;
    starty++;
    offset++;
}
if (n % 2)
{
	nums[n/2][n/2] = count;
}
return nums

C++:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> nums(n, vector<int> (n ,0); // 定义二维数组
        int i,j;
        int startx = 0; // // 定义每循环一个圈的起始位置
        int starty = 0;
        int offset = 1;   // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
        int mid = n / 2;  // 矩阵的中间位置
        int loop = n / 2; // 循环次数
        int count = 1;
        while (loop--)
        {
        	i = startx;
        	j = starty;
        	// 填充上行从左到右(左闭右开)
        	for (j = starty; j < n - offset; j++)
        	{
        		nums[startx][j] = count++;
        	}
        	// 填充右列从上到下(左闭右开)
        	for (i = startx; i < n - offset; i++)
        	{
        		nums[i][j] = count++;
        	}
        	// 填充下行从右到左(左闭右开)
        	for ( ; j > starty; j--)
        	{
        		nums[i][j] = count++;
        	}
        	// 填充左列从下到上(左闭右开)
        	for ( ; i > startx; i--)
        	{
        		nums[i][j] = count++;
        	}
        	offset++;
        	// 第二圈开始的时候,起始位置要各自加1
        	startx++;
        	starty++;
        }
        if (n % 2)// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        {
        	nums[mid][mid] = count;
        }
        return nums;
    }
};

Python:

class Solution(object):
    def generateMatrix(self, n):
        """
        :type n: int
        :rtype: List[List[int]]
        """
        nums = [[0] * n for _ in range(n)]
        mid = n // 2  # 矩阵的中心点
        loop = n // 2 # 迭代次数
        # 起始点
        startx = 0
        starty = 0
        count = 1
        offset = 1    # 偏移量
        while loop:
            i = startx
            j = starty
            while j < n - offset:
                nums[startx][j] = count
                count += 1
                j += 1
            while i < n - offset:
                nums[i][j] = count
                count += 1
                i += 1
            while j > starty:
                nums[i][j] = count
                count += 1
                j -= 1
            while i > startx:
                nums[i][j] = count
                count += 1
                i -= 1
            startx += 1
            starty += 1
            offset += 1
            loop -= 1
        if n % 2 != 0:
            nums[mid][mid] = count
        return nums

今天真是搞了不少时间,鼓励坚持两天的自己😀😀😀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/206494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

snat与dnat

一.SNAT的原理介绍 1.应用环境 局域网主机共享单个公网IP地址接入Internet &#xff08;私有IP不能在Internet中正常路由&#xff09; 2.SNAT原理 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映谢 数据包从内网发送到公网时&#xf…

嵌入式数据传输及存储的C语言实现

各种类型的数据传输和存储就涉及到大小端的问题&#xff0c;首先要简单说下芯片的大小端问题&#xff0c;这里主要讨论Cortex-M内核。 M内核支持大端或者小端&#xff0c;实际应用中大部分内核都是小端。以STM32为例&#xff0c;全部都是小端&#xff0c;而且是芯片设计之初就固…

飞致云开源社区月度动态报告(2023年11月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…

Linux安全配置

进入ssh配置文件 vim /etc/ssh/sshd_config将port 22中的端口号改为5001 重启ssh服务 systemctl restart sshd拓展 sh与bash iptable与firewall ssh与sshd vps与ssh 参考&#xff1a; 【安全-SSH】SSH安全设置 - CSDN AppLinux VPS服务器SSH端口一键修改脚本​Linux脚本…

TA-Lib学习研究笔记——Price Transform (五)

TA-Lib学习研究笔记——Price Transform &#xff08;五&#xff09; 1.AVGPRICE Average Price 函数名&#xff1a;AVGPRICE 名称&#xff1a;平均价格函数 语法&#xff1a; real AVGPRICE(open, high, low, close) df[AVGPRICE] tlb.AVGPRICE(df[open],df[high],df[low…

量子力学:探索微观世界的奇妙之旅

量子力学&#xff1a;探索微观世界的奇妙之旅 引言 在21世纪初&#xff0c;我们逐渐进入了一个以信息技术为主导的新时代。在这个时代&#xff0c;量子力学作为一门研究物质世界微观结构、粒子间相互作用以及能量与信息转换的基础科学&#xff0c;对我们的生活产生了深远的影响…

【机器学习】线性模型之逻辑回归

文章目录 逻辑回归Sigmoid 函数概率输出结果预测值与真实标签之间的并不匹配交叉熵逻辑回归模型 梯度下降逻辑回归模型求解编程求解sklearn 实现&#xff0c;并查看拟合指标 逻辑回归 逻辑回归是一种广义线性模型&#xff0c;形式上引入了 S i g m o i d Sigmoid Sigmoid 函数…

波奇学C++:C++11的可变参数模板和emplace

可变参数模板 // args是参数包 template<class T,class ...Args> void _ShowList(T value, Args... args) {cout << sizeof...(args) << endl; // 2cout << value << " ";/*_ShowList(args...);*/} int main() {_ShowList(1,2,3); re…

快速了解ChatGPT(大语言模型)

目录 GPT原理&#xff1a;文字接龙&#xff0c;输入一个字&#xff0c;后面会接最有可能出现的文字。 GPT4 学会提问&#xff1a;发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记&#xff1a; Lee老师幽默的开场&#xff1a; GPT&#xff1a;chat Ge…

SQL server 基线安全加固操作

账号管理、认证授权 ELK-Mssql-01-01-01 编号 ELK-Mssql-01-01-01 名称 为不同的管理员分配不同的账号 实施目的 应按照用户分配账号&#xff0c;避免不同用户间共享账号,提高安全性。 问题影响 账号混淆&#xff0c;权限不明确&#xff0c;存在用户越权使用的可能。 …

Kafka的存储机制和可靠性

文章目录 前言一、Kafka 存储选择二、Kafka 存储方案剖析三、Kafka 存储架构设计四、Kafka 日志系统架构设计4.1、Kafka日志目录布局4.2、Kafka磁盘数据存储 五、Kafka 可靠性5.1、Producer的可靠性保证5.1.1、kafka 配置为 CP(Consistency & Partition tolerance)系统5.1.…

Pandas进阶:transform 数据转换的常用技巧

引言 本次给大家介绍一个功能超强的数据处理函数transform&#xff0c;相信很多朋友也用过&#xff0c;这里再次进行详细分享下。 transform有4个比较常用的功能&#xff0c;总结如下&#xff1a; 转换数值 合并分组结果 过滤数据 结合分组处理缺失值 一. 转换数值 pd.…

Linux常用命令——mv命令

文章目录 1. 简介2. 命令格式3. 主要参数4. 常见用法及示例4.1 移动文件4.2 重命名文件4.3 交互式移动文件4.4 强制移动文件4.5 移动多个文件4.6 使用通配符移动文件 5. 注意事项6. 结论 1. 简介 mv 命令在Linux系统中用于移动文件或目录&#xff0c;同时也可以用于重命名文件…

解决antd upload自定义上传customRequest,上传时一直loading加载的问题

问题&#xff1a;antd自定义上传customRequest时&#xff0c;无法正常显示上传成功状态&#xff0c;一直在上传的loading状态中。 查看customRequest参数 解决方法&#xff1a;调用onSuccess事件&#xff0c;解决loading一直加载的问题。 <template><a-uploadref&q…

cmake和vscode 下的cmake的使用详解(一)。

本文的内容 参考如下内容。 1.【基于VSCode和CMake实现C/C开发 | Linux篇】https://www.bilibili.com/video/BV1fy4y1b7TC?vd_source0ddb24a02523448baa69b0b871ab50f7 2.Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 3.关于如何利用…

11.30_黑马Redis实战篇分布式锁

实战篇9 设立一个在jvm外的锁监视器&#xff0c;可以处理多线程的问题 实战篇10 获取锁的时候&#xff0c;要同时发生获取锁以及设置到期时间。 实战篇11 thinking&#xff1a;JAVA中的自动拆箱与装箱&#xff1f; 【Java基础】自动拆装箱_Elephant_King的博客-CSDN博客 TR…

SQL Sever 基础知识 - 数据筛选

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

笔记64:Bahdanau 注意力

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a

C语言--有三个字符串,要求找出其中长度最大的那一个

一.题目描述 有三个字符串&#xff0c;要求找出其中长度最大的那一个。 比如&#xff1a;输入三个字符串是&#xff1a; 第一个字符串:hello 第二个字符串&#xff1a;worldasd 第三个字符串&#xff1a;abcd 输出&#xff1a;最长的字符串是&#xff1a;worldasd 二.思路分析…

井盖位移报警器安装,智能化井盖厂家推荐

当井盖发生位移或倾斜时&#xff0c;通常会引起所处道路的安全隐患&#xff0c;给过往的车辆和行人带来许多潜在的危险。为了避免潜在的安全事故频繁出现&#xff0c;及时发现并处理井盖位移或倾斜才能更好的保障人民的安全。因此安装井盖位移报警器是满足政府和市民需求的。 单…