【数组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--;
    }
}
相关推荐
图灵-M1 小时前
【数据结构】静态 & 动态顺序表
c语言·数据结构·笔记
careathers2 小时前
【数据结构】基于比较的排序算法 - 选择排序
数据结构·算法·排序算法
XiYang-DING3 小时前
P4104.环形链表判断
数据结构·链表
逆向编程4 小时前
MATLAB高级数据结构:cell、struct与table深度应用
开发语言·数据结构·matlab
m0_6399069415 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
2601_9707038319 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
丘山望岳1 天前
单调栈和单调队列
数据结构
UIU1141 天前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
黎相思1 天前
BTree
数据结构·b树·b+树
UIU1142 天前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划