数据结构初阶---复杂度的OJ例题

news2024/11/24 14:07:46

复杂度的OJ例题

  • 一、消失的数字
    • 1.思路一
    • 2.思路二
    • 3.思路三
  • 二、旋转数组
    • 1.思路一
    • 2.思路二
    • 3.思路三

一、消失的数字

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

1.思路一

排序+遍历:如果下一个数据不等于上一个数据加1,那么下一个数据就是那个消失的数字。
时间复杂度:O(N*LogN)由于这个时间复杂度时间复杂度过高,本思路不再冗余,赘述。

2.思路二

利用等差数列公式:从0加到n,然后再减去这个数组中的所有数字,那么最终所得的差就是缺失的数字。
时间复杂度:O(N)
代码如下:

#include <stdio.h>
int missingNumber(int* nums, int numsSize)
{
    int N = numsSize;
    int ret = N * (N + 1) / 2;
    for (int i = 0; i < N; i++)
    {
        ret -= nums[i];
    }
    return ret;
}

int main()
{
    int nums[] = { 0,1,2,3,4,5,7,8,9,10 };
    int sz = sizeof(nums) / sizeof(nums[0]);
    int ret=missingNumber(nums,sz);
    printf("%d", ret);
	return 0;
}

3.思路三

单身狗思路:利用:按位异或运算符:^(相同为0,相异为1)任何数字和0 ^ 还等于它本身。首先我们要把一个完整的数组按位异或起来,然后再与题目中缺失一个数字的数组再进行按位异或,最终得到的结果就是消失的数字。
代码如下:

#include <stdio.h>
int missingNumber(int* nums, int numsSize)
{
    int N = numsSize;
    int x = 0;
    //第1个循环的目的:先把一个完整的数组:从0~n的所有数字全部按位异或起来存放在一个数字x中
    //注意:这里循环的终止条件是:<=N,(因为我们连N也要算上)
    for (int i = 0; i <= N; i++)
    {
        x ^= i;
    }
    //第2个循环的目的:就是让一个完整的数组与缺失一个数字的数组进行按位异或,最终得到的结果就是那个消失的数字!
    //注意:这里循环的终止条件是:<N,(因为nums数组中确失一个数字)
    for (int i = 0; i < N; i++)
    {
        x ^= nums[i];
    }
    return x;
}

int main()
{
    int nums[] = { 0,1,2,3,4,5,7,8,9,10 };
    int sz = sizeof(nums) / sizeof(nums[0]);
    int ret=missingNumber(nums,sz);
    printf("%d", ret);
	return 0;
}

二、旋转数组

链接力扣:旋转数组

1.思路一

中规中矩:依次向左旋转K个数据
合计旋转:K%N次
时间复杂度:O(N^2)
空间复杂度:O(1)
因为时间复杂度超过限制,所以说不予实现。

2.思路二

核心思想:以空间换时间:我额外开辟一个数组,直接复制从k开始后面所有数据到前面,然后把复制n-k的数字放后面。
时间复杂度:O(N)
空间复杂度:O(N)
在这里插入图片描述
代码如下:

void rotate(int* nums, int numsSize, int k)
{
    int n = numsSize;
    int* tmp = (int*)malloc(sizeof(int) * n);
    k %= n;//一定别忘了k%n!

    memcpy(tmp, &nums[n - k], sizeof(int) * k);
    memcpy(&tmp[k], nums, sizeof(int) * (n - k));
    memcpy(nums, tmp, sizeof(int) * n);

    free(tmp);//一定别忘了Free!!!因为是动态开辟的空间
}

int main()
{
	int nums[] = { 1,2,3,4,5,6,7 };
	int k = 0;
	printf("请输入你想要旋转的次数:");
	scanf("%d", &k);
    int sz = sizeof(nums) / sizeof(nums[0]);
    rotate(nums, sz, k);

    for (int i = 0; i < sz; i++)
    {
        printf("%d ", nums[i]);
    }
	return 0;
}

3.思路三

数学思想:以k为划分界线,左边逆置,右边逆置,整体逆置。

在这里插入图片描述
代码如下:

//逆置函数
void Inversion(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)
{
    int n = numsSize;
    k %= n;

    Inversion(nums, 0, n - k - 1);//左边逆置
    Inversion(nums, n - k, n - 1);//右边逆置
    Inversion(nums, 0, n - 1);//整体逆置

}

int main()
{
	int nums[] = { 1,2,3,4,5,6,7 };
	int k = 0;
	printf("请输入你想要旋转的次数:");
	scanf("%d", &k);
    int sz = sizeof(nums) / sizeof(nums[0]);
    rotate(nums, sz, k);

    for (int i = 0; i < sz; i++)
    {
        printf("%d ", nums[i]);
    }
	return 0;
}

好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!
在这里插入图片描述

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

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

相关文章

用「埋点」记录自己,不妄过一生

最近有朋友问我「埋点怎么做」&#xff0c;给朋友讲了一些互联网广告的案例&#xff0c;从源头的数据采集讲到末尾的应用分析和流量分配等&#xff08;此处省略N多字&#xff09; 解释完以后&#xff0c;我想到一个问题&#xff1a;有了埋点可以做分析&#xff0c;那我们对自己…

尚硅谷大数据项目《在线教育之实时数仓》笔记006

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第9章 数仓开发之DWD层 P041 P042 P043 P044 P045 P046 P047 P048 P049 P050 P051 P052 第9章 数仓开发之DWD层 P041 9.3 流量域用户跳出事务事实表 P042 DwdTrafficUserJum…

Android岗位居然要求有鸿蒙开发的需求了?HarmonyOS它来了

鸿蒙才开发几年,就已经让对手们脊背发凉了&#xff0c;要知道主流操作系统都是积累几十年的产物。 以苹果MacOS为例,其前身NextStep是85年开干的。另一家微软公司,Win95爆卖的时候,中国还没加入WTO。 大家使用过鸿蒙系统产品的,应该能直观感觉到它的流畅性,易用性,如果你有个…

leetcode刷题日记:70.Climbing Stairs(爬楼梯)

给了我们n阶楼梯让我们去爬&#xff0c;每次只能爬1阶或2阶&#xff0c;这个我们可以使用递归的方法进行解决&#xff0c;向上爬的过程与向下降的过程是一样的&#xff0c;所以我们就可以这样考虑&#xff0c;现在就是n阶楼梯每一次下降1阶或2阶有多少种方法刚好下降到0阶。 i…

IDEA取消git对项目的版本控制

前言 前几天新建项目的时候不小心选了个git仓库&#xff0c;导致这个测试项目一直被git管理着。 解决办法 1 右键项目 选择打开资源目录 2 删除.git文件 把目录下的.git文件删掉 3 删除idea中的git管理 删除完.git文件后&#xff0c;进入idea&#xff0c;右下角会有这样的提…

ElementUI-tree拖拽功能与节点自定义

前言 在管理端会遇到多分类时&#xff0c;要求有层次展示出来&#xff0c;并且每个分类有额外的操作。例如&#xff1a;添加分类、编辑分类、删除、拖到分类等。 下面将会记录这样的一个需求实习过程。 了解需求 分类展示按层级展示分类根据特定的参数展示可以操作的按钮&a…

cookie、session和Token的区别?JWT又是什么?单点登录又是什么?头大?快进来看看,一文帮你捋清楚~

目录 0、HTTP是无状态的 1、前端标记cookie 1.1、cookie限制空间范围 1.2、cookie限制时间范围 1.3、cookie限制使用方式 2、服务端存储session库 2.1、我们先来简单聊聊session是什么&#xff1f; 2.2、session的存储方式 2.3、session的过期和销毁 2.4、session的分…

操作系统:文件管理(二)文件系统

一战成硕 4.3 文件系统4.3.1 文件系统结构4.3.2 文件系统布局4.3.3 外存空闲空间管理4.3.4 虚拟文件系统 4.3 文件系统 4.3.1 文件系统结构 4.3.2 文件系统布局 文件系统在磁盘中的结构 文件系统在内存中的结构 内存中的信息用于管理文件系统并通过缓存提高性能&#xff0c;这…

HDFS系统权限详解

一&#xff0c;HDFS超级用户 启动namenode的用户就是HDFS中的超级用户 如图所示 HDFS中&#xff0c;也是有权限控制的&#xff0c;其控制逻辑和Linux文件系统的完全一致 但是不同的是&#xff0c;两个系统的Supergroup不同(超级用户不同) Linux的操作用户是root HDFS文件系统的…

AI 编程界的扛把子

大家好&#xff0c;我是伍六七。 全国最大 AI 社群《AI 破局俱乐部》初创合伙人。8 年 Java 经验&#xff0c;干过开发&#xff0c;也做过管理。目前在某互联网大厂从事 Java 开发&#xff0c;业余时间研究 AI 编程。 我从 2022 年底&#xff0c;ChatGPT 问世&#xff0c;就密…

K8S知识点(五)

&#xff08;1&#xff09;资源管理介绍 Pod控制器的作用&#xff0c;就是为了最终产生各种各样的Pod&#xff0c;Pod里面运行容器&#xff0c;容器里面运行程序 程序需要数据持久化&#xff0c;可以用数据存储卷来存储 Pod想要让外部访问需要通过Service代理&#xff0c;外部…

基于Pytorch框架的LSTM算法(一)——单维度单步预测(1)

1.项目说明 使用data中的close列的时间序列数据完成预测【使用close列数据中的前windowback-1天数据完成未来一天close的预测】 2.数据集 Date,Open,High,Low,Close,Adj Close,Volume 2018-05-23,182.500000,186.910004,182.179993,186.899994,186.899994,16628100 2018-05…

IDEA高效调试,你真的会了吗

大家好&#xff0c;这里是 一口八宝周 &#x1f44f; 欢迎来到我的博客 ❤️一起交流学习 文章中有需要改进的地方请大佬们多多指点 谢谢 &#x1f64f; 由于平时工作中经常需要debug调试代码&#xff0c;每次调试都会阻塞住进程&#xff0c;影响别人排查问题。 “你一个人deb…

Linux生成动态库

动态库 1.命名规则 Linux&#xff1a; libxxx.so lib &#xff1a;前缀&#xff08;固定的&#xff09;&#xff1b;xxx&#xff1a;动态库的名字&#xff08;自己取&#xff09;&#xff1b;.so&#xff1a;后缀&#xff08;固定的&#xff09;&#xff1b; Windows&#…

.NET Framework中自带的泛型委托Action

Action<>是.NET Framework中自带的泛型委托&#xff0c;可以接收一个或多个输入参数&#xff0c;但不返回任何参数&#xff0c;可传递至多16种不同类型的参数类型。在Linq的一些方法上使用的比较多。 1、Action泛型委托 .NET Framework为我们提供了多达16个参数的Action…

链表面试OJ题(1)

今天讲解两道链表OJ题目。 1.链表的中间节点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个…

轻量封装WebGPU渲染系统示例<19>- 使用GPU Compute材质多pass元胞自动机(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifeMultiMaterialPass.ts 系统特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调…

1200*D. Same Differences(数学推公式)

Problem - 1520D - Codeforces 解析&#xff1a; 统计 a [ i ] - i #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int t,n,a[N]; signed main(){scanf("%lld",&t);while(t--){scanf("%lld",&n);…

一些对程序员有用的网站

当你遇到问题时 Stack Overflow&#xff1a;订阅他们的每周新闻和任何你感兴趣的主题Google&#xff1a;全球最大搜索引擎必应&#xff1a;在你无法使用Google的时候CSDN&#xff1a;聊胜于无AI导航一号AI导航二号 新闻篇 OSCHINA&#xff1a;中文开源技术交流社区 针对初学…

FPGA设计过程中有关数据之间的并串转化

1.原理 并串转化是指的是完成串行传输和并行传输两种传输方式之间的转换的技术&#xff0c;通过移位寄存器可以实现串并转换。 串转并&#xff0c;将数据移位保存在寄存器中&#xff0c;再将寄存器的数值同时输出&#xff1b; 并转串&#xff0c;将数据先进行移位&#xff0…