源狀態到目標狀態,判是否可達
本題轉化成判斷兩數組元素所分別構成的兩個集合是否相等
對數組中的元素進行特定的操作,判斷能否達到目標狀態。這是一類經典題目。不過當前這個Leetcode1460比較簡單。
簡單證明
因爲相鄰兩個元素屬於子數組,冒泡排序的過程就涉及相鄰兩個元素構成的子數組的翻轉。所以,如果兩個數組arr
和target
分別進行冒泡排序且能得到同樣的升序(或降序)序列,那麼對target
數組進行剛纔冒泡排序過程中的逆操作,這個target
數組又能回到一開始的初始狀態了。所以兩個數組arr
和target
冒泡排序得到的序列相同,則表明通過翻轉子數組可從arr
到target
。
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%真爽