【数据结构】_时间复杂度相关OJ(力扣版)

devtools/2025/2/6 16:15:28/

目录

1. 示例1:消失的数字

思路1:等差求和

思路2:异或运算

思路3:排序+二分查找

2. 示例2:轮转数组

思路1:逐次轮转

思路2:三段逆置(经典解法)

思路3:开辟新数组


1. 示例1:消失的数字

题目链接:

面试题 17.04. 消失的数字 - 力扣(LeetCode)

思路1:等差求和

第一步:0—N利用求和公式计算总和,

第二步:减去数组中的所有元素的值,得到的差值即缺失的元素,

时间复杂度为O(N);

实现程序如下:

int missingNumber(int* nums, int numsSize) {int N=numsSize;// 0~numsSize共numsSize+1个数字int sum=(0+N)*(N+1)/2;for(int i=0;i<numsSize;i++){sum-=nums[i];}return sum;
}

思路2:异或运算

第一步:用0与数组中所有的数据都异或一遍;

第二步:所得结果再与0—N之间的数字异或一遍;

因为异或与顺序无关,存在的数字都异或了两次,最终结果都是0(同0异1),只有那个0—N之间存在然而数组中不存在的数字经过两次异或后结果为1,这个数就是缺失的数字。

实现程序如下:

int missingNumber(int* nums, int numsSize) {int x=0;for(int i=0;i<numsSize;i++){x^=nums[i];}for(int j=0;j<numsSize+1;j++){x^=j;}return x;
}

思路3:排序+二分查找

第一步:将数组元素进行排序,降序升序均可,以升序为例;

第二步:按照0~N的顺序依次查找,若下一个数不等于上一个数+1,则下一个数字为消失的数字;

分析时间复杂度:冒泡排序O(N)+二分查找log N 或 快排O(N)+二分查找log N二者均不满足复杂度要求,故不做详细解释。

2. 示例2:轮转数组

题目链接:

189. 轮转数组 - 力扣(LeetCode)

思路1:逐次轮转

对于N个元素向右轮转k个位置的轮转次数分析:

若不考虑轮转的周期性,则时间复杂度为O(K*N),(准确为O(K*(N-1)))

但由于数组长度定长,必然存在一些旋转的周期性问题。

真实旋转次数为k%=N,

最好的情况为旋转N的倍数次,即k%N==0,相当于没有旋转;

最坏的情况为k%N==N-1(量级为N),故时间复杂度为O(N^2);

void rotate(int* nums, int numsSize, int k) {k%=numsSize;// 旋转k轮while(k--){// 旋转1轮int tmp=nums[numsSize-1];for(int i=numsSize-2;i>=0;i--){nums[i+1]=nums[i];}nums[0]=tmp;}
}

存在问题:这种暴力求解的时间复杂度过高:

思路2:三段逆置(经典解法)

对于N个元素向右轮转k个位置的轮转,先将前n-k个逆置,再将后k个逆置,最后再整体逆置,即可达到预期轮转效果。此种情况下,时间复杂度为O(N)。(准确计算为O(2*N))

实现程序如下:

void reverse(int* nums,int left,int right){while(left<right){int tmp=nums[left];nums[left]=nums[right];nums[right]=tmp;left++;right--;}}
void rotate(int* nums, int numsSize, int k) {k%=numsSize;reverse(nums,0,numsSize-k-1);reverse(nums,numsSize-k,numsSize-1);reverse(nums,0,numsSize-1);
}

思路3:开辟新数组

额外开辟一个数组,将nums数组后k个元素存放至arr数组前k个位置,将nums数组前numsSize-k个元素存放至arr数组后numsSize-k个位置,再将arr元素依次赋值给nums元素:

#include<string.h>
void rotate(int* nums, int numsSize, int k) {int arr[numsSize];k%=numsSize;int n=numsSize;memcpy(arr, nums+n-k,sizeof(int)*k);memcpy(arr+k,nums,sizeof(int)*(n-k));memcpy(nums,arr,sizeof(int)*n);
}

注:若未采用memcpy,也可使用循环实现逐个拷贝:

void rotate(int* nums, int numsSize, int k) {int arr[numsSize];k%=numsSize;int n=numsSize;// 将nums数组后k个元素存放至arr数组前k个位置for(int i=0;i<=k-1;i++){arr[i]=nums[n-k+i];}// 将nums数组前n-k个元素存放至arr数组后n-k个位置for(int j=0;j<=n-k-1;j++){arr[k+j]=nums[j];}// 将arr元素依次赋值给nums元素for(int x=0;x<=n-1;x++){nums[x]=arr[x];}
}


http://www.ppmy.cn/devtools/156565.html

相关文章

C语言内存之旅:从静态到动态的跨越

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…

自定义数据集,使用scikit-learn 中K均值包 进行聚类

代码&#xff1a; # 导入必要的库 import matplotlib.pyplot as plt # 用于绘制图形 from sklearn.cluster import KMeans # KMeans 聚类算法 import numpy as np # 数值计算库# 定义 class1 到 class4 的数据点&#xff0c;模拟四个不同的类&#xff08;每个类7个二维点&a…

【高阶数据结构(一)】:LRU Cache

LRU Cache 一、LRU Cache概念二、LRU Cache的实现三、实现 一、LRU Cache概念 LRU&#xff08;Least Recently Used&#xff09;最近最少使用&#xff0c;是一种cache替换算法。Cache的容量是优先的&#xff0c;当容量达到上限时&#xff0c;如果还有新的数据需要插入&#xff…

vue中的v-cloak和v-pre有什么作用

v-cloak v-cloak用于防止vue模板在编译完成之前显示未编译的原始Mustache语法&#xff08;如 {{ message }}&#xff09;&#xff0c;用于防止页面闪烁。 使用场景&#xff1a; <div v-cloak>{{ message }} </div> <style>[v-cloak] {display: none;} <…

因果推断与机器学习—用机器学习解决因果推断问题

Judea Pearl 将当前备受瞩目的机器学习研究戏谑地称为“仅限于曲线拟合”,然而,曲线拟合的实现绝非易事。机器学习模型在图像识别、语音识别、自然语言处理、蛋白质分子结构预测以及搜索推荐等多个领域均展现出显著的应用效果。 在因果推断任务中,在完成因果效应识别之后,需…

SQL Server配置管理器无法连接到 WMI 提供程序

目录 第一步第二部 第一步 发现没有资源管理器 ​​​​ 在文件夹找到管理器 打开发现报这个错误 配置管理器无法连接到 WMI 提供程序第二部 https://blog.csdn.net/thb369208315/article/details/126954074

Axure入门教程 -- 第五章:原型优化与调试

第五章&#xff1a;原型优化与调试 1. 原型预览与导出 预览功能的使用 操作步骤&#xff1a; 点击右上角的“预览”按钮&#xff0c;打开浏览器查看当前页面原型。使用浏览器开发者工具检查页面的响应效果。 互动练习&#xff1a; 创建一个简单的页面&#xff08;如登录页面&a…

配置@别名路径,把@/ 解析为 src/

路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js &#xff0c;内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定&#xff1a; 使用 表示src文件所在路径: path.resolve(__dirname,src)…