Welcome to Subscribe On Youtube
3682. Minimum Index Sum of Common Elements 🔒
Description
You are given two integer arrays nums1
and nums2
of equal length n
.
We define a pair of indices (i, j)
as a good pair if nums1[i] == nums2[j]
.
Return the minimum index sum i + j
among all possible good pairs. If no such pairs exist, return -1.
Example 1:
Input: nums1 = [3,2,1], nums2 = [1,3,1]
Output: 1
Explanation:
- Common elements between
nums1
andnums2
are 1 and 3. - For 3,
[i, j] = [0, 1]
, giving an index sum ofi + j = 1
. - For 1,
[i, j] = [2, 0]
, giving an index sum ofi + j = 2
. - The minimum index sum is 1.
Example 2:
Input: nums1 = [5,1,2], nums2 = [2,1,3]
Output: 2
Explanation:
- Common elements between
nums1
andnums2
are 1 and 2. - For 1,
[i, j] = [1, 1]
, giving an index sum ofi + j = 2
. - For 2,
[i, j] = [2, 0]
, giving an index sum ofi + j = 2
. - The minimum index sum is 2.
Example 3:
Input: nums1 = [6,4], nums2 = [7,8]
Output: -1
Explanation:
- Since no common elements between
nums1
andnums2
, the output is -1.
Constraints:
1 <= nums1.length == nums2.length <= 105
-105 <= nums1[i], nums2[i] <= 105
Solutions
Solution 1: Hash Map
We initialize a variable $\textit{ans}$ as infinity, representing the current minimum index sum, and use a hash map $\textit{d}$ to store the first occurrence index of each element in array $\textit{nums2}$.
Then we iterate through array $\textit{nums1}$. For each element $\textit{nums1}[i]$, if it exists in $\textit{d}$, we calculate the index sum $i + \textit{d}[\textit{nums1}[i]]$ and update $\textit{ans}$.
Finally, if $\textit{ans}$ is still infinity, it means no common element was found, so we return -1; otherwise, we return $\textit{ans}$.
The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array.
-
class Solution { public int minimumSum(int[] nums1, int[] nums2) { int n = nums1.length; final int inf = 1 << 30; Map<Integer, Integer> d = new HashMap<>(); for (int i = 0; i < n; i++) { d.putIfAbsent(nums2[i], i); } int ans = inf; for (int i = 0; i < n; i++) { if (d.containsKey(nums1[i])) { ans = Math.min(ans, i + d.get(nums1[i])); } } return ans == inf ? -1 : ans; } }
-
class Solution { public: int minimumSum(vector<int>& nums1, vector<int>& nums2) { int n = nums1.size(); const int inf = INT_MAX; unordered_map<int, int> d; for (int i = 0; i < n; i++) { if (!d.contains(nums2[i])) { d[nums2[i]] = i; } } int ans = inf; for (int i = 0; i < n; i++) { if (d.contains(nums1[i])) { ans = min(ans, i + d[nums1[i]]); } } return ans == inf ? -1 : ans; } };
-
class Solution: def minimumSum(self, nums1: List[int], nums2: List[int]) -> int: d = {} for i, x in enumerate(nums2): if x not in d: d[x] = i ans = inf for i, x in enumerate(nums1): if x in d: ans = min(ans, i + d[x]) return -1 if ans == inf else ans
-
func minimumSum(nums1 []int, nums2 []int) int { const inf = 1 << 30 d := make(map[int]int) for i, x := range nums2 { if _, ok := d[x]; !ok { d[x] = i } } ans := inf for i, x := range nums1 { if j, ok := d[x]; ok { ans = min(ans, i + j) } } if ans == inf { return -1 } return ans }
-
function minimumSum(nums1: number[], nums2: number[]): number { const n = nums1.length; const inf = 1 << 30; const d = new Map<number, number>(); for (let i = 0; i < n; i++) { if (!d.has(nums2[i])) { d.set(nums2[i], i); } } let ans = inf; for (let i = 0; i < n; i++) { if (d.has(nums1[i])) { ans = Math.min(ans, i + (d.get(nums1[i]) as number)); } } return ans === inf ? -1 : ans; }