Two sum leetcode solution
Задачка с Leetcode, найти в массиве значения суммы двух элементов которых равны определенному числу. Например int[] nums = {1,3,4,5}; int target = 8. Элементы 3 и 5(индексы в массиве 1 и 3). Стандартное решение с помощью циклов:
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] {i, j};
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
Вариант с использованием Map:
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int difference = target - nums[i];
if (map.containsKey(difference)){
result[0] = i;
result[1] = map.get(difference);
return result;
}
map.put(nums[i], i);
}
return result;
}
Но стало интерсно что есть еще одно решение которое является самым быстрым:
public int[] twoSum(int[] nums, int target) {
int MOD = 2047;
int arr[] = new int[2048];
int len=nums.length;
for(int i=0;i<len;i++)
{
int key = target - nums[i] & MOD;
if(arr[key]!=0)
{
return new int[]{arr[key]-1,i};
}
arr[nums[i] & MOD]=i+1;
}
return null;
}
Кто нибудь может пояснить зачем определяем int = 2047 и массив на 2048 элементов?
Ответы (1 шт):
Это не решение задачи а уловка. Данная программа написана в предположении, что никто не проверит её на больших числах. Видимо автор решил, что 2048 - достаточно большое число. Программа работает правильно для чисел в диапазоне 0 - 2047. 2047 - это верхний индекс массива размером 2048.