首页 > 编程语言 >数据结构算法题

数据结构算法题

时间:2024-09-24 12:21:48浏览次数:9  
标签:right r2 nums int 算法 数组 数据结构 left

目录

轮转数组

在这里插入图片描述
思路1:
1.利用循环将最后一位数据放到临时变量(n)中
2.利用第二层循环将数据往后移一位
3.将变量(n)的数据放到数组第一位
时间复杂度:O(N^2)
空间复杂度:O(1)
思路2:
1.创建一个空间大小足够的数组
2.将数组按轮转的要求依次放入我们创建的数组里
3.再将新数组的内容依次存放的原数组中
时间复杂度:O(N)
空间复杂度:O(N)
这个思路就是利用空间来换时间了,随着计算机的发展,计算机的空间相比时间来说会廉价很多,必要情况下我们就可以选择使用空间来换取时间。
思路3:
1.将要轮转的元素首位调换
2.将不需要轮转的元素首位调换
3.将整个数组元素首位调换
时间复杂度:O(N)
空间复杂度:O(1)
具体流程如图所示:
在这里插入图片描述
很显然第三个思路是最好的,这里代码就只介绍思路3了。
代码实现:

void Swap(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) {
    Swap(nums,0,numsSize-1-k);
    Swap(nums,numsSize-k,numsSize-1);
    Swap(nums,0,numsSize-1);
}

这个代码就完成了,但是在LeetCode提交出错了。
在这里插入图片描述
出错原因:只有一个数据但是他让我轮转两次。
解决办法:
在开始时让k模上一个数据个数。

void rotate(int* nums, int numsSize, int k) {
    k%=numsSize;
    Swap(nums,0,numsSize-1-k);
    Swap(nums,numsSize-k,numsSize-1);
    Swap(nums,0,numsSize-1);
}

题目链接: https://leetcode.cn/problems/rotate-array/submissions/567566749/

原地移除数组中所有元素val

要求:时间复杂度:O(N),空间复杂度:O(1)
在这里插入图片描述

案例:
在这里插入图片描述
思路:
1.定义两个变量left与right充当指针,都指向数组的第一个位置。
2.判断right当前的数据是否等于val
相等:right++
不相等:right指向的值赋值给left,right++,left++
3.返回left的数值就是当前数组有效数据的个数
left指向的时数组当前的位置,在它之前的数据都是有效的,因为下表是从0开始,所以数据个数就是最后一个数据的下表加一,推理得left值就是有效数据个数。
代码实现:

int removeElement(int* nums, int numsSize, int val) {
    int left=0;
    int right =0;
    while(right<numsSize)
    {
        if(nums[right]==val)
        {
            right++;
        }
        else
        {
            nums[left++]=nums[right++];
        }
    }
    return left;
}

题目链接:https://leetcode.cn/problems/remove-element/description/

删除有序数组中的重复项

在这里插入图片描述
案例:
在这里插入图片描述
思路:
1.定义两个变量left与right,一个指向下表0的位置,一个指向下表1的位置
2.判断left与right所指元素是否相等
相等:right++;
不相等:left++,right的值赋值给left,right++
3.返回left的值
代码实现:

int removeDuplicates(int* nums, int numsSize) {
    int left=0;
    int right =1;
    while(right<numsSize)
    {
        if(nums[left]!=nums[right])
        {
            left++;
            nums[left]=nums[right];
        }
        right++;


    }
    return left+1;
    
}

题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/

合并两个有序数组

在这里插入图片描述
案例:
在这里插入图片描述
思路:
注意这里得题目要求,它的第一个数组的大小是第一个数组数据个数与第二个数组的数据个数之和,也就是它的大小可以刚好容纳两个数组的全部数据。
1.创建三个变量r,r1,r2
r指向第一个数组最后一个位置
r1指向数组1最后一个有效数据
r2指向数组2最后一个有效数据
2.比较两个数组最后一个有效数据大小
r1>r2:r1指向的数据放入r的空间,r1–;
r2>r1:r2指向的数据放入r的空间,r2–;
相等的话上面两个随便选一个方案即可
3.判断r2是否小于0
r2小于0,说明数组2的数据已经全部转移完,这个时候排序就完成了
r2>0,让数组2的剩余的没有比较的数据再依次放入数组1
代码实现:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
   
    int r1 = (m - 1);
    int r2 = (n - 1);
    int r = m + n - 1;
    while ((r1 >= 0) &&( r2 >= 0))
    {
        if (nums1[r1] >= nums2[r2])
        {
            nums1[r] = nums1[r1];
            r1--;
        }
        else
        {
            nums1[r] = nums2[r2];
            r2--;
        }
        r--;
    }
    while (r2 >= 0)
    {
        nums1[r--]=nums2[r2--];
    }
}

题目链接:https://leetcode.cn/problems/merge-sorted-array/
---------------------------------------------------分割符
以上算法题可以通过画图来帮助自己理解,画图也更方便自己理解解题思路。
有更优算法请在评论区交流,谢谢。

标签:right,r2,nums,int,算法,数组,数据结构,left
From: https://blog.csdn.net/qq_71391318/article/details/142484677

相关文章

  • 数据结构:单链表
    单链表单链表概念与结构节点链表的性质单链表的打印实现单链表创建新的节点在末尾插入数据在头部插入数据删除尾部数据删除第一个节点在链表中寻找目标数据在指定位置之前插入数据在指定位置之后插⼊数据删除pos结点删除pos之后的结点销毁链表单链表测试单链表概念与......
  • 基于AFM注意因子分解机的推荐算法
    1.项目简介项目A033基于AFM(AttentionFactorizationMachine)的推荐算法,旨在通过引入注意力机制提升推荐系统的性能。推荐系统的核心是帮助用户在海量信息中找到符合个人需求的内容,而传统的因子分解机(FM)模型虽然能够捕捉特征间的线性关系,却无法有效利用复杂的高阶特征交互......
  • uniapp微信小程序 [AI算法识别] camera拍摄 实时帧的实现
    <template> <viewclass="con"> <camera device-position="back" frame-size="small" resolution="high" @initdone="startListener" @stop="endListener" @error="er......
  • 代码随想录算法训练营Day13 | 递归遍历、迭代遍历、层序遍历
    目录递归遍历和迭代遍历:144.二叉树的前序遍历94.二叉树的中序遍历145.二叉树的后序遍历层序遍历:102.二叉树的层序遍历107.二叉树的层序遍历Ⅱ199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧......
  • 基础数据结构之链表
    链表1)概述定义在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续Incomputerscience,alinkedlistisalinearcollectionofdataelementswhoseorderisnotgivenbytheirphysicalplacementinmemory.Instead,eachelem......
  • N个utils(加密解密-算法初窥)
    MD5+SHA1publicstaticStringsignature(StringappKey,StringappSecret,longclientTime,Stringversion)throwsException{StringpathString="appKey="+appKey+"&clientTime="+clientTime+"&version="+version......
  • 【算法】递归
    【ps】本篇有5 道 leetcode OJ。 目录一、算法简介二、相关例题1)汉诺塔问题.1-题目解析.2-代码编写2)合并两个有序链表.1-题目解析.2-代码编写3)反转链表.1-题目解析.2-代码编写4)两两交换链表中的节点.1-题目解析.2-代码编写5)Pow(x,n).1-题目......
  • C语言结构体、指针和常见数据结构
    在学习C语言时,结构体、指针和常见的数据结构如链表、栈、队列、二叉树等,是绕不开的重点。本篇博客用通俗易懂的方式,介绍这些概念,结合简单的代码示例,带你逐步掌握这些基础知识。1.结构体和指针我们先来看一眼结构体和指针,不懂这些的话,下面的代码肯定看不懂,没学过......
  • 数据结构-线性表的单链式存储结构图解及C语言实现
    概念链式存储:结点在存储器中的位置是任意的,即逻辑相邻的数据元素在物理上不一定相邻链式存储结构也称非顺序映像或链式映像图解链式存储结构中结点一般有两个部分组成,即数据域(data)和指针域,数据域是用于存放数据的,指针域是用来指向下一结点的地址的,其中头节点指向该链表......
  • 【数据结构和算法实践-排序-归并排序】
    数据结构和算法实践-排序-归并排序题目MyThought代码示例JAVA-8题目排序MyThought然后再进行递归,递归要注意两个方面:一、自我调用二、终止条件:即函数边界注意点:树、递归*代码示例JAVA-8publicclassMergeSort{publicstaticvoidmergeSor......