アルゴリズムOJ問題(1)

1. ソートされた配列内の重複を削除する

元のリンク: https://leetcode.cn/problems/remove-duplicates-from-sorted-array/

 

 

 アイデア:ダブル ポインター アルゴリズムを使用すると、時間計算量が O(1) に達する可能性があります。

具体的なプロセス:(図で説明)

 

 コード:

int removeDuplicates(int* nums, int numsSize)
{
    if(numsSize==0)
        return 0;
	int i=0,j=1;
    int dst=0;
    while(j<numsSize)
    {
        if(nums[i]==nums[j])
        {
            ++j;
        }
        else
        {
            nums[dst]=nums[i];
            dst++;
            i=j;
            j++;
        }
    } 
    nums[dst]=nums[i];
    dst++;
    return dst;
}

2. ソートされた 2 つの配列をマージする

   元のタイトルのリンク: https://leetcode.cn/problems/merge-sorted-array/

 アイデア: ダブル ポインター演算

実装プロセス:

2 つの配列の最後の要素を指す 2 つの変数 end1、end2 をそれぞれ定義します。

num1[end1] と num2[end2] のサイズを比較し、大きい方の値を配列 1 の後ろから前に順番に移動します。

以下に示すように:

 コード:

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

おすすめ

転載: blog.csdn.net/m0_73648729/article/details/130442959