【数据结构】--189.轮转数组

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤

📃个人主页 :阿然成长日记 👈点击可跳转

📆 个人专栏: 🔹数据结构与算法🔹C语言进阶

🚩 不能则学,不知则问,耻于问人,决无长进

🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

189.轮转数组

💬前言:

🌸 hello大家好✨又见面了 。

本篇算法中关于数组问题,很适合刚开始学习数据结构与算法的小伙伴学习。小编也是刚刚开始,希望一起学习,多多交流,共同进步!

📋题目要求

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

示例 1:

输入: nums = 1,2,3,4,5,6,7, k = 3
输出: 5,6,7,1,2,3,4

解释:

1.向右轮转 1 步: 7,1,2,3,4,5,6

2.向右轮转 2 步: 6,7,1,2,3,4,5

3.向右轮转 3 步: 5,6,7,1,2,3,4

示例 2:

输入:nums = -1,-100,3,99, k = 2
输出:3,99,-1,-100

解释:

1.向右轮转 1 步: 99,-1,-100,3

2.向右轮转 2 步: 3,99,-1,-100

📑 解题思路

🕜1.暴力求解

思路:右旋K次。

c 复制代码
void rotate(int* nums, int numsSize, int k){
    int temp = 0;
    k=k%numsSize;
    while(k--)
    {
        temp = nums[numsSize-1];

        for(int i=numsSize-1;i>0;i--)
        {
        nums[i] = nums[i-1];
        }
        nums[0] = temp;
    }
}

复杂度分析:
时间复杂度 O(N^2),
空间复杂度 O(1),

🔸暴力求解思路十分简单,但是非常耗费时间,这里就已经运行超出时间限制啦。

🕜方法二

在K的位置截断,将K前数组与K后的数组交换位置 。

1️⃣ 这里我们的办法是先将nums数组后k个数放到tmp新数组中

2️⃣ 再将nums的前n-k个数放入tmp中

3️⃣最后,再将已经排好的数组放回nums中,便于此题函数的返回是nums,tmp只是我们临时建立的数组。

c 复制代码
void rotate(int* nums, int numsSize, int k)
{
	int* tmp = (int*)malloc(sizeof(int) * numsSize);
	int n = numsSize;
	k %= n;

	memcpy(tmp, nums + n - k, sizeof(int) * k);
	memcpy(tmp+k, nums , sizeof(int) * (n - k));
	memcpy(nums,tmp, sizeof(int) * (n));

}

根据分析:
时间复杂度:O(N);
空间复杂度:O(N);

🔸这种方法其实就是在用空间 换 时间。

这里我们使用了库函数<string.h>中的memcmp函数,具体函数使用讲解

友友们,可以点击这里👉memcmp函数的详解

方法三:

逆置法:

思路

1️⃣ 以n+k为准,分为两部分

2️⃣ 各数组进行逆置

3️⃣ 最后,在整体数组逆置

代码实现

c 复制代码
void reverse(int* a, int left, int right)
{
	while (left < right)
	{
		int tmp = a[left];
		a[left] = a[right];
		a[right] = a[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);
}

可见,这种方法的效率十分的快,就是很难想到。
时间复杂度:O(N)
空间复杂度:O(N)

总结

关于数组的算法题,一般不会太难,学会找到最高效的那种方法,并掌握它是最关键的。

各位看官老爷,咱下回再见!
别忘了点赞关注加评论哟
💙 💜 ❤️ 💚 💔 💓 💗 💕 💞 💘 💖 ✨ ⭐️ 🌟

相关推荐
Navigator_Z12 分钟前
LeetCode //C - 1269. Number of Ways to Stay in the Same Place After Some Steps
c语言·算法·leetcode
2601_9657422215 分钟前
短视频脚本创作方法分享:本地生活类账号的起步思路
大数据·人工智能·算法·ai·新媒体运营·生活
55873生态系统手记24 分钟前
读完 55873 资产钱包的技术栈,我重新理解了 "合规钱包" 应该长什么样
算法·架构
旋生万物27 分钟前
素数螺旋映射 $z_n=n^{1+i}$ 的角分布统计检验与零模型对比
大数据·前端·人工智能·算法·云原生·螺旋生成论·螺旋相位
HRTOS29 分钟前
HRTOS Shell继续完善:优化printf缓冲区与字符串越界保护,国庆后随新版本更新
运维·单片机·嵌入式硬件·算法·51单片机
邵奈一1 小时前
当沉香之乡遇上 Seed-2.1-pro:我用 AI 给村子做了一个数字门面
算法·架构
海天一色y1 小时前
图像分割全解析:从经典算法到深度学习的原理与实战(Python + MATLAB)
python·深度学习·算法
SelectDB技术团队1 小时前
ClickHouse 存日志的能力边界:并发、检索与 trace 回放的实测对照
数据结构·数据库·clickhouse·日志分析·apache doris·日志存储
垆边人似月.1 小时前
华为算法题:最长连续递增子序列的变
数据结构·算法·leetcode
YOLO数据集集合1 小时前
机器学习二分类预测算法组合工具:12种算法、113种组合的批量建模方案8031期
算法·机器学习