数据结构:复杂度的练习(笔记)

news2024/12/25 0:11:22

数据结构:复杂度的练习(笔记)

例题一:

 

        可以先给数组排序,然后再创建一个i值,让他循环一次++一次,遍历这个排序后的数组,但如果用qsort函数进行排序,时间复杂度就和题目要求的不一致了。所以这个方法行不通

 

        可以将0-n的整数全部相加,然后减去数组中的每个元素,那么就会得到缺失的那个数,此时也会发现时间复杂度是O(N),符合题目的要求。所以这个方法可以

        可以创建一个数组arr2,将题目给的数组arr1内的数字 作为arr2的下标,并且将值放进去。最后如果发现arr2数组内那个坐标没有值,那么就是哪个数。发现时间复杂度也是O(N)。所以这个方法也可以。

        这里将arr1放入arr2,需要循环N次,在这个循环外,需要遍历arr2中缺失的那个数,又需要N次,因此F(N) = 2N  那么时间复杂度就是:O(N)

        相比与思路2,思路3略比逊色。

        异或:相同位0.不同为1 

        两个相同的数字异或是0:x^x=0

        因此,x先和[0,n]异或,就会拿到[0,n]这些数字,也就是x就会被赋予这些数字。当这些数字,再在有缺失的数组中异或,得到的就会是哪个缺失的数字。

        无论数组中的数字是不是[0.n]的顺序,只要期间内和相同的数字异或,那么就会是0。

        如:x^y^b^a^y^a^b==x^y^y^a^a^b^b==x^0^0^0==x(缺失的那个数)

        因此,无论x先和谁异或,只要相同的两个数异或过,那么就相当于异或上0,也就是会被消掉。

        最后时间复杂度:O(N)

就用思路4来写一段代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
int main()
{
	
	int arr1[] = { 9,0,1,8,4,6,5,3,7};//缺失2
	int x = 0;
	int n = sizeof(arr1) / sizeof(arr1[0]);//题目中的n是给定的,不算入时间复杂度。
	for (int i = 0; i <= n; i++)
	{
		x ^= i;
		i != n ? x ^= arr1[i] : NULL ;//防止越界访问
	}
	printf("%d\n", x);
	//结果:2
	return 0;
}

        i != n ? x ^= arr1[i] : NULL ;使用的是三目运算符(条件运算符),当i==n时,arr1并没有arr1[n]元素,如果访问了,就是越界访问,会出现问题。因此当i==时,执行NULL,也就是不执行。

例题二:

对于这道题,有单独的文章:

         C语言题目:左旋字符串._srhqwe的博客-CSDN博客

方法一(对应C语言题目:左旋字符串._srhqwe的博客-CSDN博客的方法一):

        空间复杂度是O(1) :因为空间是可以重复利用的,tmp被释放掉,然后又用tmp。

       时间复杂度是O(N*K):保存变量,然后旋转n-1次,就是N,其中要执行K次,所以是K*N。

方法二:

         开辟一块空间(数组)tmp,将要旋转的个数,对应nums元素的位置,然后直接放到tmp数组,在把nums剩下的元素,再放到tmp数组。

        如此,时间复杂度是O(N)  空间复杂度是O(N),但题目要求空间复杂度是O(1),因此这里并不符合题目的要求。

方法三(三步反转法:对应C语言题目:左旋字符串._srhqwe的博客-CSDN博客的方法二):

        

时间复杂度是:O(N)

空间复杂度是:O(1) 

因为方法1和3在另一篇文章都有,就写一遍方法2,但是!方法2并不符合题目要求。        

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int tmp[20] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//元素个数
	int k = 3;//假如要向左旋转的字符个数为3
	for(int i = 0;i<sz-k;i++)//将arr后6个,放到tmp的前6个当中
	{
		tmp[i] = arr[k + i];
	}
	for (int i = 0; i <k ; i++)//将arr前3个,放到tmp后3个中
	{
		tmp[sz - k + i] = arr[i];
	}
	for (int i = 0; i < sz; i++)//打印tmp的每个元素
	{
		printf("%d ", tmp[i]);
		//结果:4 5 6 7 8 9 1 2 3
	}//实现反转

	return 0;
}

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

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

相关文章

Vue组件进阶(动态组件,组件缓存,组件插槽,具名插槽,作用域插槽)与自定义指令

Vue组件进阶与自定义指令一、Vue组件进阶1.1 动态组件1.2 组件缓存1.3 组件激活和非激活1.4 组件插槽1.5 具名插槽1.6 作用域插槽1.7 作用域插槽使用场景二、自定义指令2.1 自定义指令--注册2.2 自定义指令-传参一、Vue组件进阶 1.1 动态组件 多个组件使用同一个挂载点&#x…

如何打造一款专属于自己的高逼格电脑桌面

作为一名电脑重度使用者&#xff0c;你是否拥有一款属于你自己的高逼格电脑桌面呢&#xff1f;你是不是也像大多数同学一样&#xff0c;会把所有的内容全部都堆积到电脑桌面&#xff0c;不仅找东西困难&#xff0c;由于桌面内容太多还会导致C盘空间不足&#xff0c;影响电脑的反…

Java分布式解决方案(一)

随着互联网的不断发展&#xff0c;互联网企业的业务在飞速变化&#xff0c;推动着系统架构也在不断地发生变化。 如今微服务技术越来越成熟&#xff0c;很多企业都采用微服务架构来支撑内部及对外的业务&#xff0c;尤其是在高 并发大流量的电商业务场景下&#xff0c;微服务…

Linux内核学习笔记——页表的那些事。

目录页表什么时候创建内核页表变化什么时候更新到用户页表源码分析常见问题解答问题一&#xff1a;页表到底是保存在内核空间中还是用户空间中&#xff1f;问题2&#xff1a;页表访问&#xff0c;软件是不是会频繁陷入内核&#xff1f;问题3&#xff1a;内存申请&#xff0c;软…

LaTeX表格自定义行高+自定义列宽+大表格自适应页面宽度

一、自定义行高 默认行高效果 自定义行高效果&#xff1a;看起来更美观、大方些 实现方式&#xff1a;在LaTeX表格中的\begin{table}和\begin{tabular}之间插入命令\renewcommand\arraystretch{1.5}&#xff0c;其中1.5这个数值是可以自定义的&#xff0c;数值越大&#xff0c;…

xmu 离散数学 卢杨班作业详解【8-12章】

文章目录第八章 树23456810第九章46811第十章24567第十一章14571116第十二章131317第八章 树 2 (2) 设有k片树叶 2∗m2∗43∗3k2*m2*43*3k2∗m2∗43∗3k n23kn23kn23k mn−1mn-1mn−1 联立解得k9 T中有9片树叶 3 有三颗非同构的生成树 4 (1) c --abc e–abed f–dgf…

2023.03.05 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.SAMPLING THE OUTPUT5.LOSS FUNCTION DESIGN5.1 ranking loss: Top1 & BPR5.2 VANISHING GRADIENTS5.3 ranking-max loss fuction5.4 BPR-max with score regularization6.实验7.结论深度学习1.相关性1.1 什么是相关性1.2 协方差1…

套接字实现TCP

套接字 套接字的意义就是客户端与服务器进行双向通信的端点&#xff0c;如果有不理解点上面套接字三字更近距离了解套接字。 网络套接字与客户连接的特定网络有关的服务端口号&#xff0c;这个端口号允许linux进入特定的端口号的连接转到正确的服务器进程。 套接字通信的建立过…

【数据结构与算法】数据结构有哪些?算法有哪些?

1. 算法与数据结构总览图 2.常用的数据结构 2.1.数组&#xff08;Array&#xff09; 数组是一种聚合数据类型&#xff0c;它是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构&#xff0c;在各种编程语言中都有对应。一个数组可以分解为多个数…

k8s篇之Pod 干预与 PDB

文章目录自愿干预和非自愿干预PDBPDB 示例分离集群所有者和应用程序所有者角色如何在集群上执行中断操作自愿干预和非自愿干预 Pod 不会消失&#xff0c;除非有人&#xff08;用户或控制器&#xff09;将其销毁&#xff0c;或者出现了不可避免的硬件或软件系统错误。 我们把这…

Vue+ECharts实现可视化大屏

由于项目需要一个数据大屏页面&#xff0c;所以今天学习了vue结合echarts的图标绘制 首先需要安装ECharts npm install echarts --save因为只是在数据大屏页面绘制图表&#xff0c;所以我们无需把它设置为全局变量。 可以直接在该页面引入echarts&#xff0c;就可以在数据大…

『MyBatis技术内幕』源码调试前提

准备源代码包 下载源代码 3.4.6 版本 https://github.com/mybatis/mybatis-3/releases?page2 通过 idea 导入然后回自动下载所有依赖&#xff0c;根据 3.4.6 版本的 pom.xml 找到依赖的 mybatis-parent 版本 <parent><groupId>org.mybatis</groupId><ar…

《计算机网络:自顶向下方法》学习笔记——第一章:计算机网络和因特网

计网 第一章 计算机网络和因特网 1.1 什么是因特网 回答这个问题有两种方式 其一&#xff0c;我们能够描述因特网的具体构成&#xff0c;即构成因特网的基本硬件和软件组件&#xff1b;其二&#xff0c;我们能够根据为分布式应用提供服务的联网基础设施来描述因特网。 1.1.…

加油站ai视觉识别系统 yolov7

加油站ai视觉识别系统通过yolov7网络模型深度学习&#xff0c;加油站ai视觉识别算法对现场画面中人员打电话抽烟等违规行为&#xff0c;还有现场出现明火烟雾等危险状态。除此之外&#xff0c;模型算法还可以对卸油时灭火器未正确摆放、人员离岗不在现场、卸油过程静电释放时间…

20230304学习笔记

1、Mybatis #{}和${}的区别是什么 a、#{}是预编辑处理、是占位符&#xff0c;${}是字符串拼接符。 b、#{}替换为&#xff1f;号&#xff0c;用PreparedStatement来赋值&#xff0c;${}直接替换变量的值&#xff0c;用Statement赋值。 c、#{}在DBMS中、自动加入单引号&#…

XSS-labs靶场1-13关解法答案

目录 XSS-labs克隆/下载地址: 第一关 解法 第二关 解法 第三关 解法 第四关 解法 第五关 解法 第六关 解法 第七关 解法 第八关 解法 第九关 解法 第十关 解法 第十一关 解法 第十二关 解法 第十三关 解法 从XSS payload 中关于浏览器解码的一些总结 XSS-labs克隆/下载地…

javaDoc生成方式

javaDoc生成方式 命令行生成 在cmd控制台窗口上找到需要生成文件的路径&#xff0c;然后执行命令。 # javadoc -encoding UTF-8 -charset UTF-8 文件名 javadoc -encoding UTF-8 -charset UTF-8 Doc.java这样就生成完成了。 测试Doc.java文件 package com.jiang.base;/***…

grid了解

结构 <div class"grid"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div>&l…

css中重难点整理

一、vertical-align 在学习vertical-align的时候&#xff0c;可能会很困惑。即使网上有一大推文章讲veitical-align,感觉看完好像懂了&#xff0c;等自己布局的时候用到vertical-align的时候好像对它又很陌生。这就是我在布局的时候遇到的问题。 本来vertical-align就很不好理…

LeetCode分类刷题-----贪心算法

贪心算法贪心455.分发饼干376.摆动序列53.最大子序和122.买卖股票的最佳时机||55.跳跃游戏45.跳跃游戏||1005.K次取反后最大化的数组和134.加油站135.分发糖果860.柠檬水找零406.根据身高重建队列452.用最少数量的箭引爆气球![在这里插入图片描述](https://img-blog.csdnimg.cn…