首页 > 其他分享 >Day2 第一章 数组part02

Day2 第一章 数组part02

时间:2024-04-06 17:23:11浏览次数:17  
标签:nums int sum part02 Day2 第一章 ++ vector result

1. 977.有序数组的平方

为什么‘非递减‘就是递增?

暴力解法就是遍历数组挨个元素平方,之后再给数组排序,这里有时间复习一下各种排序的时间复杂度以及空间复杂度!

在移除数组元素那道题里,涉及到位置变更以及要求时间复杂度为O(n),从这可以看到一点用双指针的规律,就是:指针设定为 一前一后一左一右 ,满足某一条件某一指针动。有一个主指针,就是左边的为主指针(我自己的理解),用于接收更新。相应的,副指针就是遍历找到满足某一条件的元素。

双指针

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;) { //注意这里i和j的增减不能在for(),需要在代码块里,因为要获取到这个元素之后才移动i和j
		if (nums[i] * nums[i] < nums[j] * nums[j]) {
			result[k--] = nums[j] * nums[j];
			j--;
		}
		else {
			result[k--] = nums[i] * nums[i];
			i++;
		}
	}
	return result;
}

2. 209.长度最小的子数组

这道题比较有意思,可以用滑动窗口的思想去理解if和while的区别。

暴力解法

int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果
        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 >= s) { // 一旦发现子序列和超过了s,更新result
                    subLength = j - i + 1; // 取子序列的长度
                    result = result < subLength ? result : subLength;
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

滑动窗口

所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

在本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

可以发现滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。

int minSubArrayLen(int target, vector<int>& nums) {
	int result= INT32_MAX;
	int sum = 0;
	int i = 0;
	int subl = 0;
	for (int j = 0; j < nums.size(); j++) {
		sum += nums[j];
		while (sum >= target) {
			subl = j - i + 1;
			sum -= nums[i];
			result = result < subl ? result : subl;
			i++;
		}
	}
	return result;
}

3. 59.螺旋矩阵Ⅱ

注意左闭右开!

vector<vector<int>> generateMatrix(int n) {
	int i, j;
	int startx = 0, starty = 0;
	int middle = n / 2;
	int loop = n / 2;
	int offset = 1;
	int count = 1;
	vector<vector<int>> res(n, vector<int>(n, 0));
	while (loop--) {
		for (j = starty; j < n - offset; j++) {
			res[startx][j] = count++;
		}
		for (i = startx; i < n - offset; i++) {
			res[i][j] = count++;
		}
		for (; j > starty; j--) {
			res[i][j] = count++;
		}
		for (; i > startx; i--) {
			res[i][j] = count++;
		}
		startx++; starty++; offset += 1;
	}
	if (n % 2 == 1) {
		res[middle][middle] = count;
	}
	return res;
}
  • 时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
  • 空间复杂度 O(1)

标签:nums,int,sum,part02,Day2,第一章,++,vector,result
From: https://www.cnblogs.com/zyl1188/p/18117625

相关文章

  • 深入理解Java异常处理机制(day20)
    异常处理异常处理是程序运行过程产生的异常情况进行恰当的处理技术在计算机编程里面,异常的情况比所我们所想的异常情况还要多。Java里面有两种异常处理方式;1.利用try···catch···finaly语句处理异常,优点是分开了处理异常代码和程序正常代码,增强了程序的可读性,减少......
  • Day1 数组第一章part01
    1.数组理论基础重点:数组是存放在连续内存空间上的相同类型数据的集合。数组下标都是从0开始的。数组内存空间的地址是连续的。正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。例如删除下标为3的元素,需要对下标......
  • 书生·浦语大模型全链路开源体系——学习笔记day2&day3--纯纯新手入门
    学习链接:tutorial/helloworld/hello_world.mdatmain·InternLM/tutorial(github.com) 【精彩,照着做就能体验很多本来遥不可及的东西】笔记分享链接:https://github.com/InternLM/tutorial/discussions/37 本笔记定位是对学习链接的补充和小白发牢骚,希望大佬能愿意点评一......
  • Java学习-第一章第二章知识内容总结
    一、第一章的学习中,我了解到了什么Java编程语言,明白了它的发展史以及平台和运行机制,下载并安装成功好了Java的开发环境JDK17以及第一个Java入门程序helloworld的编写,还有就是懂得了如何用IDEA和JShell交互式这两种开发方式来编写简单的程序;二、在第二章的学习中,我对Java的数据......
  • 信号与线性系统分析第一章总结
    参考资料:《信号与线性系统分析》第五版吴大正著......
  • 软考中级(网络工程师考核要点)第一章 计算机网络系统(信道特性应用)第九期(海明码和CRC
    第八期的题目分析:1.分析:D。光纤通信的使用是波分复用,T1/E1是同步时分复用,因为它们使用固定的时钟来确定数据的传输速率。同时,T1/E1也支持异步传输,但通常以同步方式使用。WIFI是异步时分复用,因为它使用无线信号传输数据,没有严格的时钟同步要求。WIFI的数据传输速率可以根据......
  • 第一章 计算机网络体系结构
    一、计算机网络概述        1)概念        计算机网络:将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的一个系统。互连的(通过通信链路互联互通的)、自治的(无主从关系)计算机集合     ......
  • 轻松玩转书生·浦语大模型趣味 Demo——day2笔记
    本节课有四个任务:学习部署、玩角色扮演的agent项目,玩数学运算agent、玩写作agent 主要学习过程就是跟着视频,复制学习文档里的资料,完成demo的使用。主要目的是熟悉开发平台。视频:轻松玩转书生·浦语大模型趣味Demo_哔哩哔哩_bilibili资料:Tutorial/helloworld/hello_world.......
  • JAVA语言学习-Day2
    参考教学视频:秦疆Java流程控制Scanner工具包(java5新特性)Scanners=newScanner(System.in);//创建对象,接收接盘数据if(s.hasNext()){  Stringa=s.next();}if(s.hasNextLine()){  Stringa=s.nextLine();}s.close();if选择结构if(boolean){  }elseif(bool......
  • 代码随想录 Day29 回溯算法 491.递增子序列 46.全排列 47.全排列 II
    491.递增子序列classSolution{private:vector<vector<int>>result;vector<int>path;voidbacktracking(vector<int>&nums,intstartIndex){if(path.size()>1){result.push_back(path);......