【时间复杂度】

news/2025/3/19 10:55:27/

旋转数组
题目
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

/*
解题思路:使用三次逆转法,让数组旋转k次
1. 先整体逆转
// 1,2,3,4,5,6,7
// 7 6 5 4 3 2 1
2. 逆转子数组[0, k - 1]
// 5 6 7 4 3 2 1
3. 逆转子数组[k, size - 1]
// 5 6 7 1 2 3 4
*/
void reverse(int* nums, int begin, int end)
{while(begin < end){int tmp = nums[begin];nums[begin] = nums[end];nums[end] = tmp;++begin;--end;}
}// 三趟逆置倒的思路
void rotate(int* nums, int numsSize, int k){if(k > numsSize){k %= numsSize;}reverse(nums, 0, numsSize-1);reverse(nums, 0, k-1);reverse(nums, k, numsSize-1);
}
void reverse(int* nums,int left,int right)
{while(left<right){int temp = nums[left];nums[left] = nums[right];nums[right] = temp;left++;right--;}return ;
}void rotate(int* nums, int numsSize, int k){//如果k大于numsSize// if(k>=numsSize)//     k = k%numsSize;reverse(nums,numsSize-k,numsSize-1);reverse(nums,0,numsSize-k-1);reverse(nums,0,numsSize-1);return ;
}

总结:
这道题目有两种思路(对于这种三次逆序的解法)

案例:nums = [1,2,3,4,5,6,7], k = 3 [5,6,7,1,2,3,4]
思路1:先去整体逆序、再去逆序0到k-1和k到n-1(后两个的顺序都可以,主要是得先去逆序0到n-1)
思路2:先去逆序(n-k)到n-1和(0到n-k-1),再去逆序0到n-1(需要最后去逆序整体0到n-1)
综上所述:先去逆序整体再去逆序两部分和先去逆序两部分再去逆序整体两种思路

当然还可以通过以空间换取时间的解决方法

void rotate(int* nums, int numsSize, int k){// 新的思路:使用拷贝+开辟新空间int n = numsSize;int* temp = (int*)malloc(n*sizeof(int));k%=n;//拷贝三步走memcpy(temp,nums+n-k,sizeof(int)*k);// 拷贝n-k到n-1memcpy(temp+k,nums,sizeof(int)*(n-k));// 拷贝0到k个 memcpy(nums,temp,sizeof(int)*n);// 将temp拷贝回去numsfree(temp);temp = NULL;
}

消失的数字
题目
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

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

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

使用双指针法来解决。(整个数组被搜索一遍,就可以得到结果)
双指针法的时间复杂度是O(N),其中N是数组的长度。
具体的做法是,初始化两个指针left和right,分别指向数组的起始位置和结束位置。
然后,通过不断移动指针来逼近sum。每次比较a+b与sum的差值的绝对值,更新最接近sum的结果。具体步骤如下:
1. 初始化两个指针left和right,分别指向数组的起始位置和结束位置。
2. 初始化最接近sum的结果为无穷大。
3. 进入循环,直到left大于等于right为止:- 计算当前指针所指的元素a和b的和sum_ab。- 如果sum_ab等于sum,直接返回a和b。- 否则,更新最接近sum的结果,如果当前差值的绝对值小于之前的最小差值,则更新结果。- 如果sum_ab小于sum,将left指针向右移动一位。- 如果sum_ab大于sum,将right指针向左移动一位。
4. 返回最接近sum的结果。
总结起来,使用双指针法可以在最快的平均时间复杂度O(N)内解决这个问题。

设某算法的递推公式是T(n)=T(n-1)+n,T(0)=1,则求该算法中第n项的时间复杂度为()

该算法的递推公式是T(n) = T(n-1) + n,初始条件是T(0) = 1。
根据递推公式,我们可以展开算法的时间复杂度如下:T(n) = T(n-1) + n= (T(n-2) + (n-1)) + n= T(n-2) + (n-1) + n= T(n-3) + (n-2) + (n-1) + n= ...= T(0) + 1 + 2 + 3 + ... + (n-2) + (n-1) + n我们知道等差数列的求和公式是:S = (n/2)(a + l),其中n是项数,a是首项,l是末项。
在这个算法中,首项a=1,末项l=n,项数n。将这些值代入公式,我们可以得到:T(n) = 1 + 2 + 3 + ... + (n-2) + (n-1) + n= (n/2)(1 + n)= (n^2 + n)/2
因此,该算法的第n项的时间复杂度为O(n^2)。
T(n)
=T(n-1)+n
=T(n-2)+(n-1)+n
=T(n-3)+(n-2)+(n-1)+n
...
=T(0)+1+2+...+(n-2)+(n-1)+n
=1+1+2+...+(n-2)+(n-1)+n
=1+(n+1)*n/2

但是:请添加图片描述


http://www.ppmy.cn/news/981022.html

相关文章

云原生网关部署新范式丨 Higress 发布 1.1 版本,支持脱离 K8s 部署

作者&#xff1a;澄潭 版本特性 Higress 1.1.0 版本已经 Release&#xff0c;K8s 环境下可以使用以下命令将 Higress 升级到最新版本&#xff1a; kubectl apply -f https://github.com/alibaba/higress/releases/download/v1.1.0/customresourcedefinitions.gen.yaml helm …

数据结构和算法——快速排序(算法概述、选主元、子集划分、小规模数据的处理、算法实现)

目录 算法概述 图示 伪代码 选主元 子集划分 小规模数据的处理 算法实现 算法概述 图示 快速排序和归并排序有一些相似&#xff0c;都是用到了分而治之的思想&#xff1a; 伪代码 通过初步的认识&#xff0c;我们能够知道快速排序算法最好的情况应该是&#xff1a; 每…

Vben Admin学习笔记

Modal 弹窗 modal弹窗一般作为单文件组件被引用&#xff0c;下面是两段示例代码&#xff1a; 弹窗文件 Modal.vue // Modal.vue <template><BasicModal v-bind"$attrs" title"Modal Title" :helpMessage"[提示1, 提示2]">Modal I…

自然语言处理从入门到应用——LangChain:模型(Models)-[聊天模型(Chat Models):基础知识]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 聊天模型是语言模型的一种变体。虽然聊天模型在内部使用语言模型&#xff0c;但它们公开的接口略有不同。它们不是提供一个“输入文本&#xff0c;输出文本”的API&#xff0c;而是提供一个以“聊天消息”作为输入和输…

LLM 基础-transformers 库快速入门

一,Transformers 术语 1.1,token、tokenization 和 tokenizer1.2,input IDs1.3,attention mask1.4,bos_token、eop_token、pad_token、eos_token1.5,decoder models1.6,架构与参数二,Transformers 功能 API 概述三,快速上手 3.1,transformer 模型类别3.2,Pipeline&l…

强化学习价值函数方法笔记

在强化学习中&#xff0c;价值函数&#xff08;Value Function&#xff09;是一个核心概念&#xff0c;它用于衡量在不同状态或状态-动作对下&#xff0c;一个智能体&#xff08;agent&#xff09;可以获得的预期累积奖励。价值函数对于智能体做出决策和学习行为策略非常重要。…

8-js高级-7(理解js的事件循环)

一、前言 JS是单线程语言&#xff0c;但是又可以做到异步处理高并发请求&#xff0c;这时就用到了JavaScript的事件循环机制 理解事件循环&#xff0c;可以帮助我们准确分析和运用各种异步形式&#xff0c;减少代码的不确定性&#xff0c;在一些执行效率优化上也能有明确的思路…

Oralce数据库 手工重新创建控制文件

控制文件对于Oralce数据库的作用&#xff0c;就好像微软操作系统中注册表的作用一样。控制文件是一个比较小的二进制文件&#xff0c;记录着数据库的结构信息。如果数据库控制文件发生孙华的话&#xff0c;则Oracle将无法正常启动。通常情况下&#xff0c;在创建数据库时会自动…