时间复杂度课后习题

目录

选择题

编程题

1.消失的数字

方法1:辅助数组法

 方法2:位运算法

方法3:求和相减法

2.轮转数组

方法1:额外数组法 

方法2:数组翻转法


选择题

1.给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是(   )

A.O(n)

B.O(n^2)

C.O(nlog2(n))

D.O(log2(n))

 解析:

  此题目中,数组元素有序,所以a,b两个数可以分别从开始和结尾处开始搜,根据首尾元素的和是否大于sum,决定搜索的移动,整个数组被搜索一遍,就可以得到结果,所以最好时间复杂度为n


2.如果一个函数的内部中只定义了一个二维数组a[3][6],请问这个函数的空间复杂度为(   )

A.O(n)

B.O(n^2)

C.O( 1 )

D.O(m*n)

答案:C

  解析:函数内部数组的大小是固定的,不论函数运行多少次,所需空间都是固定大小的,因此空间复杂度为O(1)


3.分析以下函数的空间复杂度

public static int[][] get2Array(int n){int[][] array = new int[n][];for(int i = 0; i < n; i++) {array[i] = new int[n-i];n--;}return array;
}

解析:

第0行n个int的空间

第1行n-1个int的空间

第2行n-2个int的空间

...

第n-1行1个元素的空间

空间总的个数为:1+2+3+...+N-1 + N + N = (1+N)*N/2 + N = N^2/2 + 3N/2

采用大O渐进发表示就是:O(N^2)

故选择C


编程题(小练一手)

1.消失的数字

面试题 17.04. 消失的数字icon-default.png?t=N7T8https://leetcode.cn/problems/missing-number-lcci/

方法1:辅助数组法

public int missingNumber(int[] nums) {int[] arr = new int[nums.length + 1];for (int i = 0; i < nums.length; i++) {arr[nums[i]] = 1;}int i = 0;for (; i < arr.length; i++) {if (arr[i] == 0) {break;}}return i;}

解析:

(1)首先遍历数组 nums,将数组中的每个元素作为辅助数组arr的下标,存放整数1。

(2)然后依次检查从 0到 n 的每个整数是否在辅助数组中,不在辅助数组中的数字即为消失的数字。

 方法2:位运算法

    public int missingNumber(int[] nums) {int flag = 0;for (int i = 0; i < nums.length; i++) {flag^=nums[i];}for (int i = 0; i <=nums.length; i++) {flag^=i;}return flag;}

解析:

利用异或运算两次遍历可以算出消失的数字

方法3:求和相减法

 public int missingNumber(int[] nums) {int sum1=0,sum2=0;for (int i = 0; i < nums.length; i++) {sum1+=nums[i];}for (int i = 0; i <=nums.length; i++) {sum2+=i;}return sum2-sum1;}

解析:

将数组 nums 的元素之和记为 sum1,1到nums.length之和记为 sum2。sum1 比sum2  消失的一个数字,因此消失的数字即为sum2-sum1 之差。


2.轮转数组

189. 轮转数组icon-default.png?t=N7T8https://leetcode.cn/problems/rotate-array/

方法1:额外数组法 

class Solution {public void rotate(int[] nums, int k) {int sz=nums.length;int[] arr = new int[sz];for (int i = 0; i < sz; i++) {arr[(i+k)%sz]=nums[i];}System.arraycopy( arr, 0, nums, 0, sz);}
}

解析: 

  我们可以使用额外的数组来将每个元素放至正确的位置。用 size 表示数组的长度,我们遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)%size 的位置,最后将新数组拷贝至原数组即可。

方法2:数组翻转法

思路如下:

  1. 首先对整个数组实行翻转。
  2. 这时候,从 k 处分隔数组,左右两数组,各自进行翻转即可。
class Solution {public void rotate(int[] nums, int k) {int sz=nums.length;k%=sz;reverse(nums,0,sz-1);reverse(nums,0,k-1);reverse(nums,k,sz-1);}public void reverse(int[] nums, int start, int end) {while (start<end){int tmp=nums[start];nums[start]=nums[end];nums[end]=tmp;start++;end--;}}
}

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化

时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化 目录 时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 北方苍鹰优化算法NGO优化VMD&#xff0c;对其分解层数&#xff0c;惩罚因子数做优化…

视频图像处理算法opencv模块硬件设计图像颜色识别模块

1、Opencv简介 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上 它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;同时提供了Python、Rub…

mysql leetcode打题记录

文章目录 完成度基本语法高级语法连接日期 函数编写函数聚合函数 因为上过的数据库课实在太水了&#xff0c;所以打算先在菜鸟教程/CSDN/leetcode先学一下基本语法&#xff0c;然后去做Stanford数据库原理的课程CS145。 小目标&#xff1a;把leetcode上不用钱的mysql的题先做一…

【Linux】环境基础开发工具使用

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;什么是软件包&#xff1f;&#x1f449;&#x1f3fb…

数据分析工具有哪些,哪个好学?

Tableau、帆软BI、思迈特BI、SpeedBI数据分析云……这些都是比较常见的BI数据分析工具。从学习成本、操作难度以及数据可视化分析效果来看&#xff0c;SpeedBI数据分析云都表现地可圈可点。 1、不需下载安装、学习成本低 SpeedBI数据分析云是一款SaaS BI数据分析工具&#xf…

一场深刻的开源聚会:KCC@北京 9.2 活动回顾

开源为我们带来了什么&#xff1f;这是这场聚会的宣传文的标题&#xff1a;https://mp.weixin.qq.com/s/5sR6TPEpQmYNBnCtVilkzg 同样这个问题也可以是极具个体化的&#xff1a;开源为我带来了什么&#xff1f;秋天的周末&#xff0c;预报有雨&#xff0c;北京的开源人还是相聚…

CentOS8安装mysql-community-client错误解决

安装MySQL5.7.37的mysql-community-client-5.7.37-1.el7.x86_64.rpm时&#xff0c;提示如下&#xff1a; 提示的意思是缺少依赖软件包。 使用如下命令安装依赖包&#xff1a; yum install libncurse* 实际安装如下两个软件包。 成功后再次安装mysql-community-client-5.7.37…

java实现对指定的敏感词汇进行过滤

项目中需要做到所发文章、评价进行敏感词过滤&#xff0c;用最原始的字符串循环过滤很显然效率不太行&#xff0c;然后查找资料看到DFA算法&#xff08;有限状态机&#xff09;&#xff0c;感觉可以用来实现敏感词过滤。 原理&#xff1a;基于状态转移来检索敏感词&#xff0c;…

Web系统常见漏洞修复

背景&#xff1a; 在工作中&#xff0c;我们的交付团队在交付项目时&#xff0c;可能会遇到甲方会使用一些第三方工具&#xff08;奇安信等&#xff09;对项目代码进行扫描&#xff0c;特别是一些对安全性要求比较高的企业&#xff0c;比如涉及到一些证券公司、银行、金融等。他…

无人机+三维实景建模助力古建筑保护,传承历史记忆

历史文化建筑&#xff0c;承载着过去各个时代的文化记忆。无论是保存还是修缮古建筑&#xff0c;都需要将其基本信息进行数字化建档&#xff0c;为修缮提供精准参考。根据住建部的要求&#xff0c;从2020年开始到2022年&#xff0c;全国需完成历史建筑100%测绘及系统录入工作&a…

MojoTween:使用「Burst、Jobs、Collections、Mathematics」优化实现的Unity顶级「Tween动画引擎」

MojoTween是一个令人惊叹的Tween动画引擎&#xff0c;针对C#和Unity进行了高度优化&#xff0c;使用了Burst、Jobs、Collections、Mathematics等新技术编码。 MojoTween提供了一套完整的解决方案&#xff0c;将Tween动画应用于Unity Objects的各个方面&#xff0c;并可以通过E…

应用商店备案登记流程解析

​ 引言&#xff1a; 随着智能手机的普及和移动互联网的发展&#xff0c;移动应用程序&#xff08;App&#xff09;已成为人们日常生活中不可或缺的一部分。在开发一个App之后&#xff0c;开发者需要将其上传到应用商店进行审核和上架。然而&#xff0c;在上架之前&#xff0…