LeetCode刷题系列之《双指针解数组》

这篇具有很好参考价值的文章主要介绍了LeetCode刷题系列之《双指针解数组》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

各位csdn的友友们好啊,今天阿博给大家分享几道leetcode上的经典数组题,通过这次的学习,相信友友们可以更全面的认识指针和数组🍉🍉🍉

一.题目描述

二.逻辑分析

三.代码解析

一.题目描述

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
示例1:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素.
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

逻辑分析

LeetCode刷题系列之《双指针解数组》

代码解析

fast为0

int removeDuplicates(int* nums, int numsSize)
{

    if (numsSize == 0)
     {
        return 0;
    }
    int fast = 0, slow = 1;
    while (fast < numsSize-1) {
        if (nums[fast] != nums[fast+1]) {
            nums[slow] = nums[fast+1];
            slow++;
        }
        fast++;
    }
    return slow;
}

fast为1

int removeDuplicates(int* nums, int numsSize)
{

    if (numsSize == 0)
     {
        return 0;
    }
    int fast = 1, slow = 1;
    while (fast < numsSize) {
        if (nums[fast] != nums[fast-1]) {
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}

二.题目描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素.
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]

逻辑分析

LeetCode刷题系列之《双指针解数组》
代码解析

int removeElement(int* nums, int numsSize, int val){
      int left=0;
      int right=0;
      for(right=0;right<numsSize;right++)
      {
          if(nums[right]!=val)
          {
              nums[left]=nums[right];     //双指针的应用
              left++;
          }
      }
      return  left;
}
int removeElement(int* nums, int numsSize, int val){
      int left=0;
      int right=0;
      while(right<numsSize)
      {
          if(nums[right]!=val)
          {
              nums[left++]=nums[right++];     //双指针的应用
          }
          else
          {
          right++;
          }
      }
      return  left;
}

这里友友们也可以这样写哦,都是正确的,友友们可以根据自己喜好去选择.🌺🌺🌺

三.题目描述

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列.
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]

逻辑分析

LeetCode刷题系列之《双指针解数组》

这里阿博给友友们再熟悉一下memmove的功能,它适用于所有的类型

LeetCode刷题系列之《双指针解数组》

代码解析

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    if(n==0&&m==0){
        return;
    }
    for(int i=0;i<n;i++){
        nums1[m+i]=nums2[i];
    }
    //memmove(nums1+m,nums2,4*n);
    int i=0;
    for(i=0;i<n+m-1;i++)
    {
            if(nums1[j]>nums1[j+1])
            {
                int temp=nums1[j];
                nums1[j]=nums1[j+1];
                nums1[j+1]=temp;
            }
    }
}

四.题目描述

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数.
输入:[3,0,1]
输出:2
输入:[9,6,4,2,3,5,7,0,1]
输出:8

逻辑分析
LeetCode刷题系列之《双指针解数组》

代码解析

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

五.题目描述

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数.
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

逻辑分析
LeetCode刷题系列之《双指针解数组》
代码解析

void rotate(int* nums, int numsSize, int k)
{
       k%=numsSize;
       while(k--)
       {
           int temp=nums[numsSize-1];
           int i=0;
           for(i=numsSize-1;i>0;i--)
           {
               nums[i]=nums[i-1];
           }
           nums[0]=temp;
       }
}

友友们注意了,这样写虽然正确,但是时间复杂度会非常高,就是ko(N),我们考虑最坏的打算就是N^2,所以这里我们采用三段逆置

逻辑分析
LeetCode刷题系列之《双指针解数组》
代码解析

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);
}

好了,友友们,以上就是阿博今天的分享了,希望友友们能够有所收获,后续阿博会继续给友友们带来更多干货知识,让我们下期再见.🌹🌹🌹文章来源地址https://www.toymoban.com/news/detail-425552.html

到了这里,关于LeetCode刷题系列之《双指针解数组》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode刷题之复制带随机指针的链表

    生命不是安排,而是追求,人生的意义也许永远没有答案,但也要尽情感受这种没有答案的人生。                                                                                                                     --弗吉尼亚.  伍尔芙         目录 前言:

    2024年02月04日
    浏览(26)
  • 【剑指offer刷题记录 java版】数组双指针 之 其它题目

    本系列文章记录labuladong的算法小抄中剑指offer题目 题目链接:https://leetcode.cn/problems/XltzEq/ 题目链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/ 题目链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/ 题目链接:https://leetcode.cn/problems/he-wei-sde-

    2024年02月11日
    浏览(37)
  • 【剑指offer刷题记录 java版】数组双指针 之 滑动窗口

    本系列文章记录labuladong的算法小抄中剑指offer题目 题目链接:https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ 题目链接:https://leetcode.cn/problems/MPnaiL/ 题目链接:https://leetcode.cn/problems/VabMRr/ 题目链接:https://leetcode.cn/problems/wtcaE1/ 题目链接:https://leetcode.cn/pr

    2024年02月09日
    浏览(43)
  • LeetCode刷题小记 一、【数组】

    本系列笔记主要作为笔者刷题的题解,所用的语言为 Python3 ,若于您有助,不胜荣幸。 1.1 理论基础 数组[array]是一种线性的数据结构,将相同的数据类型存储在连续的内存空间当中,我们将元素在数组中的位置称为该元素的索引[index]。由于数组是连续存储的特性,我们访问

    2024年02月19日
    浏览(35)
  • 【LeetCode刷题记录】数组专题

    说明 : 文章内容为个人的力扣刷题记录,不定时更新。 文章内容如有错误,欢迎指正。 2023-04-24 题目1. 两数之和 1. 两数之和 - 力扣(Leetcode) 方法一:暴力解法,循环遍历 C++ python 方法二:哈希表 参考1. 两数之和 - 力扣(Leetcode) 哈希表的查找时间复杂度为O(1),可以大大

    2024年02月02日
    浏览(34)
  • LeetCode刷题--- 最大子数组和

    个人主页: 元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题   【C++】     ​​​​​​ 数据结构与算法  ​​​ 前言:这个专栏主要讲述动态规划算法,所以下面题目主要也是这些算法做的   我讲述题目会把讲解部分分为3个部分: 1、

    2024年01月23日
    浏览(44)
  • 【双指针】经典数组双指针题LeetCode

    27. 移除元素 简单 题目链接 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间, 你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的

    2024年02月12日
    浏览(29)
  • LeetCode刷题(ACM模式)-01数组

    参考引用:代码随想录 注:每道 LeetCode 题目都使用 ACM 代码模式,可直接在本地运行,蓝色字体为题目超链接 0. 数组理论基础 数组( array )是 存放在连续内存空间上的相同类型数据的集合 ,是一种 复合数据类型 ,它是 有序数据的集合 ,在存储空间中也是按顺序存储。数

    2024年02月11日
    浏览(30)
  • 【leetcode刷题之路】面试经典150题(2)——双指针+滑动窗口+矩阵

    2 双指针 2.1 【双指针】验证回文串 题目地址:https://leetcode.cn/problems/valid-palindrome/description/?envType=study-plan-v2envId=top-interview-150   详见代码。 2.2 【双指针】判断子序列 题目地址:https://leetcode.cn/problems/is-subsequence/description/?envType=study-plan-v2envId=top-interview-150   双指针挨个遍

    2024年02月19日
    浏览(38)
  • 【LeetCode】189. 轮转数组 - 双指针

    189. 轮转数组

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包