LeetCode练题 --- 对应数据结构顺序表复习

1.顺序表

        1.1 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。返回 k。

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

         1.2 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

        方法一:本质上就是再创建一个数组,将两个数组进行合并,再将新创建的数组传给nums1.

//方法一:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int end1 = 0;
    int end2 = 0;
    int end = m + n;
    int end3 = 0;
    int nums3[end];
    while(end1 < m && end2 < n){
        if(nums1[end1] > nums2[end2]){
            nums3[end3++] = nums2[end2++];
        }
        else{
            nums3[end3++] = nums1[end1++];
        }
    }
    while(end1 < m){
        nums3[end3++] = nums1[end1++]; 
    }
    while(end2 < n){
        nums3[end3++] = nums2[end2++];
    }
    for(int i = 0;i < end;i++){
        nums1[i] = nums3[i];
    }
}

         方法二:将运用两个有序数组的特性,从两个数组的最大值开始比较,大的一方放入nums1数组的最大值的位置,再以此往前放,当nums1数组的值还没有比较完,可以不增加操作;当nums2数组的值还有值没有比较完,需要将剩下的值放入nums1数组中。

//方法二:
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(nums1[end1] <= nums2[end2]){
            nums1[end] = nums2[end2];
            end2--;
            end--;
        }
        else if(nums1[end1] > nums2[end2]){
            nums1[end] = nums1[end1];
            end1--;
            end--;
        }
    }
    while(end2 >= 0){
        nums1[end] = nums2[end2];
        end--;
        end2--;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值