【数组OJ题】

删除排序数组中的重复项
题目来源

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

c 复制代码
int removeDuplicates(int* nums, int numsSize) {
    //使用三个指针
    // [0,0,1,1,1,2,2,3,3,4]
    //  0 1 2 3 4 5 6 7 8 9
    // 5
    int cur = 0;
    int ret = 1;
    int begin = 0;
    int n = numsSize;

    while (ret < n) {
        if (nums[cur] == nums[ret]) {
            ret++;
        }
        else {
            nums[begin] = nums[cur];
            begin++;
            cur = ret;
            ret++;
        }
    }
    nums[begin] = nums[cur];
    begin++;
    return begin;
}
c 复制代码
int removeDuplicates(int* nums, int numsSize) {
    //三指针
    int cur = 0;
    int tail = 1;
    int temp = 0;

    // [0,0,1,1,1,2,2,3,3,4]
    while (tail < numsSize)
    {
        if (nums[cur] == nums[tail]) {
            tail++;
        }
        else {
            nums[temp] = nums[cur];
            temp++;
            //temp每次存储完成之后都会加一
            //0之后变为1、1之后变为2...
            //所以说temp就是数据元素个数
            cur = tail;
            tail++;
        }
    }

    //还需要把最后一个数据加上
    nums[temp] = nums[cur];
    //
    temp++;

    return temp;
}

合并两个有序数组
题目来源

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

c 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    //使用m和n
    // nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
    // [1,2,2,3,5,6]
    int end1 = m-1;
    int end2 = n-1;
    int ends = m+n-1;
    while((end1>=0)&&(end2>=0)){
        if(nums1[end1]>=nums2[end2]){
            nums1[ends] = nums1[end1];
            end1--;
            ends--;
        }else{
            nums1[ends] = nums2[end2];
            end2--;
            ends--;
        }
    }
    //end1 和 end2
    //if end2先走完了 啥也不用变
    //if end1先走完了 需要将end2剩余元素放到nums1中
    while(end2>=0){
        nums1[ends] = nums2[end2];
        end2--;
        ends--;
    }
}
c 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int end1 = m - 1;
    int end2 = n - 1;
    int end = m + n - 1;
    while (end1 >= 0 && end2 >= 0)
    {
        if (nums2[end2] >= nums1[end1]) {
            nums1[end] = nums2[end2];
            end2--;
            end--;
        }
        else {
            nums1[end] = nums1[end1];
            end1--;
            end--;
        }
    }
    while (end2 >= 0)
    {
        nums1[end] = nums2[end2];
        end2--;
        end--;
    }
}
相关推荐
字节跳动的猫1 小时前
LikeShop 积分体系全链路改造:获取规则、订单抵扣与积分商品兑换二开
运维·数据结构
上位机妹子2 小时前
C 语言 数组删除指定元素(快慢指针法)
c语言·数据结构·算法
C++ 老炮儿的技术栈5 小时前
有符号变量与无符号变量的区别
服务器·开发语言·前端·数据结构·c++·算法·c
keyipatience6 小时前
跳表详细解析
开发语言·数据结构·c++·算法·跳表
小小、码农6 小时前
〖Linux文件系统〗:彻底打通文件 IO 全链路
linux·开发语言·数据结构·c++·系统
INGNIGHT7 小时前
1897 · 会议室 3(扫描线)
数据结构·算法
All for pursuit.8 小时前
【贪心-2】253.会议室 II
数据结构·c++·算法·leetcode
Logic10111 小时前
C语言/数据结构字符串题解:按字符类型重排(数字→字母→符号)——三趟扫描稳定分区
c语言·数据结构·字符串·时间复杂度·计数排序·算法题·ascii
Logic10117 小时前
C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
小蒋学算法18 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法