Binary Search to Find Next Greater Element III
ou are given an integer array nums.
A mirror pair is a pair of indices (i, j) such that:
0 <= i < j < nums.length, andreverse(nums[i]) == nums[j], wherereverse(x)denotes the integer formed by reversing the digits ofx. Leading zeros are omitted after reversing, for examplereverse(120) = 21.
Return the minimum absolute distance between the indices of any mirror pair. The absolute distance between indices i and j is abs(i - j).
If no mirror pair exists, return -1.
Example 1:
Input: nums = [12,21,45,33,54]
Output: 1
Explanation:
The mirror pairs are:
- (0, 1) since
reverse(nums[0]) = reverse(12) = 21 = nums[1], giving an absolute distanceabs(0 - 1) = 1. - (2, 4) since
reverse(nums[2]) = reverse(45) = 54 = nums[4], giving an absolute distanceabs(2 - 4) = 2.
The minimum absolute distance among all pairs is 1.
Example 2:
Input: nums = [120,21]
Output: 1
Explanation:
There is only one mirror pair (0, 1) since reverse(nums[0]) = reverse(120) = 21 = nums[1].
The minimum absolute distance is 1.
Example 3:
Input: nums = [21,120]
Output: -1
Explanation:
There are no mirror pairs in the array.
Constraints:
1 <= nums.length <= 1051 <= nums[i] <= 109
public class Solution {
public int MinMirrorPairDistance(int[] nums)
{
Hashtable numToListIndexes = new Hashtable();
for (int i = 0; i < nums.Length; i++)
{
if (!numToListIndexes.ContainsKey(nums[i])) numToListIndexes.Add(nums[i], new List());
List list = (List)numToListIndexes[nums[i]];
list.Add(i);
}
int retVal = Int32.MaxValue;
for (int i = 0; i < nums.Length; i++)
{
int rev = ReverseNumber(nums[i]);
if (numToListIndexes.ContainsKey(rev))
{
List sortedList = (List)numToListIndexes[rev];
retVal = Math.Min(retVal, MinDistBinarySearch(i, sortedList));
}
}
return (retVal == Int32.MaxValue) ? -1 : retVal;
}
private int ReverseNumber(int n)
{
int rev = 0;
while (n > 0)
{
rev = 10 * rev + n % 10;
n /= 10;
}
return rev;
}
private int MinDistBinarySearch(int target, List sortedList)
{
int left = 0;
int right = sortedList.Count - 1;
while (left < right)
{
int mid = (left + right) / 2;
if (sortedList[mid] == target)
{
left = mid;
break;
}
if (sortedList[mid] > target) right = mid - 1;
else left = mid + 1;
}
while (left < sortedList.Count && sortedList[left] <= target)
left++;
if (left >= sortedList.Count) return Int32.MaxValue;
return sortedList[left] - target;
}
} 
Comments
Post a Comment