数据结构(初阶)(一)----算法复杂度

server/2025/1/22 7:44:35/

算法复杂度

数据结构

数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希等

算法

算法:就是定义良好的计算过程,他取⼀个或⼀组的值为输⼊,并产⽣出⼀个或⼀组值作为输出。简单来说算法就是⼀系列的计算步骤,⽤来将输⼊数据转化成输出结果。

算法效率

算法是有好坏优劣之分的,这就牵扯复杂度的概念

复杂度的概念

衡量⼀个算法的好坏,⼀般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度

时间复杂度主要衡量⼀个算法的运⾏快慢,⽽空间复杂度主要衡量⼀个算法运⾏所需要的额外空间。


我们给出以下例子:

在这里插入图片描述

void rotate(int* nums, int numsSize, int k) {while(k--){int tmp = nums[numsSize - 1];for(int i = numsSize - 1;i > 0;i--){nums[i] = nums[i-1];}nums[0] = tmp;}}

当我们写下以上代码时,提交发现会给出:超出时间限制的提示。

此时证明我们写下的代码的时间复杂度是不符合要求的


经过思考后,我们想到可以创建一个临时数组来存放轮转k次后所得的元素,然后将临时数组的元素再赋给原数组,这样我们就只需独立的遍历数组,时间复杂度就降低到了O(n),但是因为我们又申请了新的空间来存放元素,那么我们的空间复杂度就同样为O(n),这是一种以空间换取时间的方法

void rotate(int* nums, int numsSize, int k) {//创建与原数组大小相等的新数组int newArr[numsSize];//遍历数组,将原数组的元素放入新数组中for(int i = 0;i < numsSize;i++){//向右轮转k次,(i+k)%numsSize对应位置刚好是我们想要的newArr[(i+k)%numsSize] = nums[i];}for(int i = 0;i < numsSize;i++){//将临时数组的元素放入原数组中nums[i] = newArr[i];}
}

那么还有没有其他的方法来完成题目要求呢?
方法是三次逆置
先对数组元素进行整体逆置,然后数组以有效轮转次数k为分界,将数组分为前后两个部分,再对前后两个部分分别逆置,得到的数组就是符合要求的。此时的时间复杂度为O(n),空间复杂度为O(1)

void swap(int* x,int* y)
{//交换元素int t = *x;*x = *y;*y = t;
}void reverse(int* nums,int a,int b)
{while(a < b){swap(&nums[a++],&nums[b--]);}
}void rotate(int* nums, int numsSize, int k) {//k是轮转的有效次数k %= numsSize;reverse(nums,0,numsSize-1);reverse(nums,0,k-1);reverse(nums,k,numsSize-1);    
}

http://www.ppmy.cn/server/160396.html

相关文章

macOS安装Gradle环境

文章目录 说明安装JDK安装Gradle 说明 gradle8.5最高支持jdk21&#xff0c;如果使用jdk22建议使用gradle8.8以上版本 安装JDK mac系统安装最新&#xff08;截止2024.9.13&#xff09;Oracle JDK操作记录 安装Gradle 下载Gradle&#xff0c;解压将其存放到资源java/env目录…

blender遇到的一个问题

1、RIGIFY ERROR: Bone spine.004: Cannot connect chain - bone position is disjoint. Incorrect armature for type chain_rigs 具体解决&#xff1a;一般是脖子那里有2个分离的脊柱&#xff0c;那2个球必须对齐在一起&#xff01; 解决办法&#xff1a;选择metarig,进入编辑…

Glide加载gif遇到的几个坑

Glide本身支持gif格式的动画加载&#xff0c;但是大多数情况下我们用Glide都是去加载一些静态图片&#xff0c;加载gif动态图的需求不是很多&#xff0c;因此这次使用Glide加载gif就遇到了一些令人匪夷所思的问题 问题一&#xff1a;加载gif图片会有明显的卡顿 通常情况下我们…

Windows系统安装 Rust 及其配置

1、在Rust官网下载Rust安装程序 &#xff08;1&#xff09;官网链接&#xff1a;Rust中文官网 &#xff08;2&#xff09;下载链接&#xff1a;下载Rust安装程序 &#xff08;3&#xff09;下载好后的rust安装程序&#xff0c;如下图&#xff1a; 2、运行 rustup-init.exe 安…

【深度学习】神经网络之Softmax

Softmax 函数是神经网络中常用的一种激活函数&#xff0c;尤其在分类问题中广泛应用。它将一个实数向量转换为概率分布&#xff0c;使得每个输出值都位于 [0, 1] 之间&#xff0c;并且所有输出值的和为 1。这样&#xff0c;Softmax 可以用来表示各类别的预测概率。 Softmax 函…

Elasticsearch:Jira 连接器教程第二部分 - 6 个优化技巧

作者&#xff1a;来自 Elastic Gustavo Llermaly 将 Jira 连接到 Elasticsearch 后&#xff0c;我们现在将回顾最佳实践以升级此部署。 在本系列的第一部分中&#xff0c;我们配置了 Jira 连接器并将对象索引到 Elasticsearch 中。在第二部分中&#xff0c;我们将回顾一些最佳实…

RHCE实验详解

目录 实验分析 环境拓扑结构 项目需求 主机环境描述 实验步骤 一、密钥互信和主机名更改 二、DNS 三、NGINX 四、MARIADB 五、NFS 六、NTP 七、论坛服务 结果展示及痛点解答 实验分析 环境拓扑结构 项目需求 1. 172.25.250.101 主机上的 Web 服务要求提供 www.ex…

多种vue前端框架介绍

学如逆水行舟&#xff0c;不进则退。 在现今的软件开发领域&#xff0c;Vue.js凭借其高效、灵活和易于上手的特性&#xff0c;成为了前端开发的热门选择。对于需要快速搭建企业级后台管理系统的开发者而言&#xff0c;使用现成的Vue后台管理系统模板无疑是一个明智之举。 本文…