【顺序表】算法题 --- 力扣

简介: 【顺序表】算法题 --- 力扣

一、移除元素

移除元素

这个题让我们移除数组nums中值为val的元素,最后返回k(不是val的元素个数)

       这样显然我们就不能再创建一个数组来解决这个问题了,只能另辟蹊径

思路:双指针

       这里定义两个指针(l1,l2)(l1,l2是整数,通过下标访问数组元素)都指向数组的起始位置,然后循环判断l1指向的元素是否等于val?如果等于,就让l2++;如果不等于,那就将l2的值赋给l1指向的元素,然后l1++,l2++。

       这样遍历完数组后,l1的值就是不等于val的元素的个数。

       这里以题目中给的案例来分析以下:

nums[l2]等于val(3),l2++;

nums[l2]不等于val(3),nums[l1++]=num[l2++];

nums[l2]不等于val(3),nums[l1++]=num[l2++];

nums[l2]等于val(3),l2++;

跳出循环,次数l1的值就是数据个数k

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

二、删除有序数组的重复项

删除有序数组的重复项

       这个题让我们删除非严格递增排列的数组中的重复数字个数,最后返回元素个数k

思路:双指针

       定义l1,l2两个指针(与上面一样,l1,l2都是整数,通过下标访问数组元素),这里l1从0开始,l2从1开始

判断nums[l1]是否等于nums[l2]?如果等于,l2++;

如果不等于,l1++后再nums[l1]=num[l2];最后l2++;

循环结束后,l1++就是元素个数k

       用题目给的示例来分析一下:

nums[l1]等于nums[l2],l2++;

nums[l1]等于nums[l2],nums[++l1]=nums[l2++];

跳出循环,此时l1=1,l1++就是不同的元素个数。

int removeDuplicates(int* nums, int numsSize) 
{
    int l1 = 0, l2 = 1; 
    while(l2<numsSize)
    {
        if(nums[l1]!=nums[l2])
        {
            l1++;
            nums[l1]=nums[l2];
            l2++;
        }
        else
        {
           l2++;
        }
    }
    return ++l1;
}

三、合并两个有序数组

合并两个有序数组

题目要求合并两个有序数组,合并后是非递减序列,最后返回nums1数组的地址。

思路:三指针

       定义三个指针(l1,l2,l3)l1指向nums1数组的最后一个有效数字,l2指向nums2数组的最后一个有效数字,l3指向nums1数组的最后一个位置。与前面的一样这三个指针也是整数,通过下标访问数组元素。

       循环中,如果nums1[l1]>nums2[l2]就让l1指向的数据存放到l3处,并l1--,l3--;

       如果nums1[l1]<=nums2[l2],就让l2指向的数据存放到l3处,并l2-- ,l3--;

       还是以题目所给的示例来分析:

nums1[l1]<nums2[l2],执行

nums1[l3]=nums2[l2];l2--;l3--;

nums1[l1]<nums2[l2],执行

nums1[l3]=nums2[l2];l2--;l3--;

现在,nums1[l1]>nums2[l2],执行

nums1[l3]=nums1[l1];l1--;l1--;

nums1[l1]等于nums2[l2],执行

nums1[l3]=nums2[l2];l2--;l3--;

现在,l2已经小于0了,循环结束,这时,nums1数组就是合并好的数组

      这里注意,如果l1先小于0,我们就需要吧nums2中剩余的数据赋给数组nums2

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

如果本篇内容对你有帮助,可以一键三连支持一下!!!

      如有错误的地方,也请各位大佬们指出纠正

相关文章
|
6天前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
4月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
6天前
|
算法
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客
|
9天前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
9 0
|
2月前
|
存储 算法
【数据结构与算法】顺序表
【数据结构与算法】顺序表
20 0
【数据结构与算法】顺序表
|
2月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
23 0
|
3月前
|
存储 算法
顺序表经典算法
顺序表经典算法
|
4月前
|
存储 算法 搜索推荐
力扣每日一题 6/13 反悔贪心算法
力扣每日一题 6/13 反悔贪心算法
41 1
|
4月前
|
存储 算法 调度
力扣中级算法(Python)
力扣中级算法(Python)