1460. Make Two Arrays Equal by Reversing Sub-arrays
Description
Given two integer arrays of equal length target
and arr
.
In one step, you can select any non-empty sub-array of arr
and reverse it. You are allowed to make any number of steps.
Return True if you can make arr
equal to target
, or False otherwise.
Example 1:
Input: target = [1,2,3,4], arr = [2,4,1,3]
Output: true
Explanation: You can follow the next steps to convert arr to target:
1- Reverse sub-array [2,4,1], arr becomes [1,4,2,3]
2- Reverse sub-array [4,2], arr becomes [1,2,4,3]
3- Reverse sub-array [4,3], arr becomes [1,2,3,4]
There are multiple ways to convert arr to target, this is not the only way to do so.
Example 2:
Input: target = [7], arr = [7]
Output: true
Explanation: arr is equal to target without any reverses.
Example 3:
Input: target = [1,12], arr = [12,1]
Output: true
Example 4:
Input: target = [3,7,9], arr = [3,7,11]
Output: false
Explanation: arr doesn't have value 9 and it can never be converted to target.
Constraints:
target.length == arr.length
1 <= target.length <= 1000
1 <= target[i] <= 1000
1 <= arr[i] <= 1000
Tags
Array
Solution
Essentially, this problem is equivalent to check if both arrays share the same elements.
Solution 1:
Sort both arrays and check each pair of values.
Solution 2:
We can use a hash table to check if there is an element that only appears once. Return false if so.
Complexity
Solution 1:
Time complexity:
Space complexity: , which is equivalent to the space complexity of quick sort algorithm.
Solution 2:
Time complexity:
Space complexity: , as the range of element is given.
Code
Solution 1:
func canBeEqual(target []int, arr []int) bool {
var m [1001]int
for i := 0; i < len(target); i++ {
m[target[i]]++
m[arr[i]]--
}
for _, n := range m {
if n != 0 {
return false
}
}
return true
}
Solution 2:
func canBeEqual1(target []int, arr []int) bool {
sort.Ints(target)
sort.Ints(arr)
for i := 0; i < len(target); i++ {
if target[i] != arr[i] {
return false
}
}
return true
}
Last updated
Was this helpful?