代码随想录刷题题Day2

news2024/11/15 17:48:27

刷题的第二天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言: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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

口碑爆棚!10款项目时间轴软件带你实现高效管理!

当我们在组织、规划或管理一个项目时&#xff0c;将所有步骤清晰地展示在一个时间轴上&#xff0c;无疑可以帮助我们更好地理解整个项目的流程&#xff0c;确定关键任务&#xff0c;并在必要时进行调整&#xff0c;项目时间轴软件在此方面发挥了重要作用。 项目时间轴软件是什…

机器学习入门(第五天)——决策树(每次选一边)

Decision tree 知识树 Knowledge tree 一个小故事 A story 挑苹果&#xff1a; 根据这些特征&#xff0c;如颜色是否是红色、硬度是否是硬、香味是否是香&#xff0c;如果全部满足绝对是好苹果&#xff0c;或者红色硬但是无味也是好苹果&#xff0c;从上图可以看出来&#…

前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案

文章目录 bug背景解决思路1&#xff1a;解决思路2解决思路3&#xff08;最终解决方案&#xff09;后记 bug背景 项目中采用富文本编辑器后传参引起的bug&#xff0c;起因如下&#xff1a; 数据库中存入的数据会变成这种未经转码的URL编码 解决思路1&#xff1a; 使用JSON方…

MyBatis的强大特性--动态SQL

目录 前言 if trim where set foreach 前言 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架&#xff0c;你应该能理解根据不同条件拼接 SQL 语句有多痛苦&#xff0c;例如拼接时要确保不能忘记添加必要的空格&#xff0c;还要注意去掉列表…

【linux防火墙】设置开启路由转发,SNAT和DNAT转换原理及应用实操,添加自定义链归类iptables规则

目录 一、关于iptables规则的保存 1.1持久保存规则 1.2加载规则 1.3开机自动加载规则 1.4使用iptables-service软件来进行规则的保存和加载&#xff08;不建议使用&#xff09; 二、SNAT和DNAT的原理和应用 SNAT的原理与应用&#xff1a; DNAT的原理和应用&#xff1a; …

MySQL之 InnoDB逻辑存储结构

InnoDB逻辑存储结构 InnoDB将所有数据都存放在表空间中&#xff0c;表空间又由段&#xff08;segment&#xff09;、区&#xff08;extent&#xff09;、页&#xff08;page&#xff09;组成。InnoDB存储引擎的逻辑存储结构大致如下图。下面我们就一个个来看看。 页&#xff08…

【Qt绘图】之绘制坦克

使用绘图事件&#xff0c;绘制坦克。 效果 效果很逼真&#xff0c;想象力&#xff0c;有没有。 示例 代码像诗一样优雅&#xff0c;有没有。 包含头文件 #include <QApplication> #include <QWidget> #include <QPainter>绘制坦克类 class TankWidge…

机器人RL数据集探索

机器人RL数据集探索 相关资料汇总 相关资料汇总

hutool的bug之 DateUtil.endOfDay(DateUtil.date())

hutool 工具类DateUtil 使用时谨慎 DateUtil.endOfDay 得到的时间保存到数据时会增加一秒 首先比较下时间的long值&#xff1a; 这样就很明显的看出来&#xff0c;hutool工具类的date是毫秒位多了.999,保存到mysql 的时候&#xff0c;MySQL数据库对于毫秒大于500的数据进行…

SPI学习

SPI介绍 SPI&#xff1a;串行外设设备接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步通信总线。 全双工&#xff1a;同一时刻&#xff0c;能同时接收数据和发送数据。 半双工&#xff1a;同一时刻&am…

树与二叉树堆:经典OJ题集

目录 查找值为x的结点&#xff1a; 思路分析&#xff1a; 单值二叉树&#xff1a; 示例&#xff1a; 思路分析&#xff1a; 相同的树&#xff1a; 示例&#xff1a; 思路分析&#xff1a; 二叉树的前序遍历&#xff1a;——使用前序遍历把结点元素放入数组中 题…

二分算法(整数二分、浮点数二分)

文章目录 二分一、整数二分&#xff08;一&#xff09;整数二分思路&#xff08;二&#xff09;整数二分算法模板1.左查找&#xff08;寻找左侧边界&#xff09;2.右查找&#xff08;寻找右侧边界&#xff09;3.总模板 &#xff08;三&#xff09;题目&#xff1a;数的范围 二、…

算法通关村第五关—Hash基础知识(青铜)

Hash基础 一、Hash的概念和基本特征 哈希(Hash)也称为散列&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变换成固定长度的输出&#xff0c;这个输出值就是散列值。很多人可能想不明白&#xff0c;这里的映射到底是啥意思&#xff0c;为啥访问的时间…

【brpc学习实践】ParallelChannel的使用与并行请求

概览 ParallelChannel (有时被称为“pchan”)同时访问其包含的sub channel,并合并它们的结果。用户可通过CallMapper修改请求,通过ResponseMerger合并结果。ParallelChannel看起来就像是一个Channel: 支持同步和异步访问。 发起异步操作后可以立刻删除。 可以取消。 支持超…

Vue生命周期:组件的生命之旅

&#x1f343;引言 在Vue.js中&#xff0c;每个组件都有其独特的生命周期。这个生命周期指的是组件从创建到销毁的一系列过程。了解并正确使用Vue的生命周期钩子&#xff0c;对于优化组件性能、管理组件状态以及实现特定功能至关重要。本文将详细介绍Vue的生命周期及其各个阶段…

mysql mybatis分页查询 大数据量 非常慢

查阅了很多博客和资料&#xff0c;这篇文章以思路为准&#xff0c;详细代码不细说&#xff0c;都是非常简单的方法&#xff0c;一看就明白。具体实现稍微百度一下就能出来。仅供参考。 如题&#xff1a;单表数据已经达到4千万条数据&#xff0c;通过mybatis的分页查询效率非常低…

如何提高销售技巧,增加客户的成交率?

如何提高销售技巧&#xff0c;增加客户的成交率&#xff1f; 在如今的市场环境中&#xff0c;销售技巧的高低往往决定了你是否能够成功地打动客户的心。想要提高销售业绩&#xff0c;除了产品质量和服务的保障&#xff0c;更需要你精进销售技巧&#xff0c;从而让客户愿意为你…

一种快速设计射频功放IC流程分享

No.1设计目标 在功率放大器PA中&#xff0c;输出级以及输出匹配决定了该功放的线性度、效率等关键性能指标&#xff0c;通常被优先考虑。在这个项目中输出级功放关键性能指标如下&#xff1a; 带宽&#xff1a;12-13 GHz OP1dB>13dBm 输出级 Power gain>5dB DE_P1dB&…

TCP解帧解码、并发送有效数据到FPGA

TCP解帧解码、并发送有效数据到FPGA 工程的功能&#xff1a;使用TCP协议接收到网络调试助手发来的指令&#xff0c;将指令进行解帧&#xff0c;提取出帧头、有限数据、帧尾&#xff1b;再将有效数据发送到FPGA端的BRAM上&#xff0c;实现信息传递。 参考&#xff1a;正点原子启…

基于springboot实现的在线考试系统

一、系统架构 前端&#xff1a;html | js | css | jquery | bootstrap 后端&#xff1a;springboot | springdata-jpa 环境&#xff1a;jdk1.7 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 管理员端-课程管理 03. 管理员端-班级管理 04. 管理员端-老师管理…