Leetcode1460,源狀態到目標狀態,判是否可達

Leetcode1460

源狀態到目標狀態,判是否可達

本題轉化成判斷兩數組元素所分別構成的兩個集合是否相等
對數組中的元素進行特定的操作,判斷能否達到目標狀態。這是一類經典題目。不過當前這個Leetcode1460比較簡單。

簡單證明

因爲相鄰兩個元素屬於子數組,冒泡排序的過程就涉及相鄰兩個元素構成的子數組的翻轉。所以,如果兩個數組arrtarget分別進行冒泡排序且能得到同樣的升序(或降序)序列,那麼對target數組進行剛纔冒泡排序過程中的逆操作,這個target數組又能回到一開始的初始狀態了。所以兩個數組arrtarget冒泡排序得到的序列相同,則表明通過翻轉子數組可從arrtarget

Naive 的解法,建兩個桶

bool canBeEqual(int* target, int targetSize, int* arr, int arrSize){
    if(targetSize != arrSize)return false;
    int ans = true;
    int* Tong1 = (int *)malloc(1001*sizeof(int));
    int* Tong2 = (int *)malloc(1001*(sizeof(int)));
    for(int i=0;i<1001;i++){
        Tong1[i]=0;
        Tong2[i]=0;
    }
    for(int i=0;i<targetSize;i++){
        Tong1[target[i]]++;
        Tong2[arr[i]]++;
    }
    for(int i=0;i<1001;i++){
        if(Tong1[i]!=Tong2[i]){
            ans = false;
            break;
        }
    }
    free(Tong1);
    free(Tong2);
    return ans;
}

建一個桶

bool canBeEqual(int* target, int targetSize, int* arr, int arrSize){
    if(targetSize != arrSize)return false;
    int ans = true;
    int* Tong1 = (int *)malloc(1001*sizeof(int));
//    int* Tong2 = (int *)malloc(1001*(sizeof(int)));
    for(int i=0;i<1001;i++){
        Tong1[i]=0;
//        Tong2[i]=0;
    }
    for(int i=0;i<targetSize;i++){
        Tong1[target[i]]++;
        Tong1[arr[i]]--;
    }
    for(int i=0;i<1001;i++){
        if(Tong1[i]!=0){
            ans = false;
            break;
        }
    }
    free(Tong1);
//    free(Tong2);
    return ans;
}

兩種測評結果對比

紅框是建一個桶的,藍色框是建兩個桶的。
在這裏插入圖片描述

感覺

雙100%真爽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章