毎日書かれたテストleetCode 26.ソートされた配列の重複を削除する

毎日書かれたテストleetCode 26.ソートされた配列の重複を削除する

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

並べ替えられた配列が与えられた場合、繰り返されている要素を削除して、各要素が一度だけ表示されるようにし、削除された配列の新しい長さを返す必要があります。

追加の配列スペースを使用しないでください。入力配列をその場で変更し、O(1)の追加スペースを完成させる必要があります。

例1:

与えられた配列nums = [1,1,2]、

関数は新しい長さ2を返す必要があり、元の配列numsの最初の2つの要素は1、2に変更されています。

新しい長さを超えて配列の要素を考慮する必要はありません。

例2:

与えられた数値= [0,0,1,1,1,2,2,3,3,4]、

この関数は新しい長さの5を返し、元の配列numsの最初の5つの要素が0、1、2、3、4に変更されています。

新しい長さを超えて配列の要素を考慮する必要はありません。

説明:

戻り値が整数であるのに、出力の答えが配列になるのはなぜですか?

入力配列は「参照」によって渡されることに注意してください。これは、関数の入力配列の変更が呼び出し元から見えることを意味します。

次のような内部操作を想像できます。

// numsは「参照」によって渡されます。つまり、実際のパラメータのコピーを作成しないでください
。intlen = removeDuplicates(nums);

//関数の入力配列の変更は、呼び出し元に表示されます。
//関数によって返された長さに従って、その長さの範囲内の配列内のすべての要素を出力します。
for(int i = 0; i <len; i ++){ print(nums [i]); }

メソッド:ダブルポインターメソッド

コードは以下のように表示されます:

package cn.lbl.face.leetCode;

/*
给定数组 nums = [1,1,2],

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。

 */
public class 删除排序数组中的重复项2 {
    
    
    public static void main(String[] args) {
    
    
//        System.out.println( removeDuplicates(new int[]{1,1,2}));
        System.out.println( removeDuplicates(new int[]{
    
    0,0,1,1,1,2,2,3,3,4}));
//        System.out.println( removeDuplicates(new int[]{0,0,1,1,1,2,2,3,3,4}));
    }

    //双指针法
    //快慢指针 i(慢)  j(快)
    public static int removeDuplicates(int[] nums) {
    
    
        int i=0;
        for (int j = 1; j <nums.length ; j++) {
    
    
            if (nums[i] != nums[j]) {
    
    
                i++;
                nums[i]=nums[j];
            }
        }
        return i+1;
    }
}

複雑さの分析

时间复杂度:O(n),假设数组的长度是 n,那么 i 和j 分别最多遍历 n 步。

空间复杂度:O(1)。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_37924905/article/details/108718920