Проблема с Leetcode:- https://leetcode.com/problems/two-sum/
Давайте разберемся в проблеме.
Здесь мы должны найти индексы двух чисел из заданного массива, в которых сумма этих двух чисел должна быть равна целевому числу, указанному в аргументе функции.
Здесь, подумал я, самое простое решение — просто найти числа, сумма которых равна целевому числу. Итак, первое, что пришло мне в голову:
целевое число = первое число + второе число
но здесь проблема в том, что числа могут быть из любых индексов. Итак, вторая мысль, которая пришла мне в голову:
целевой номер = массив[i] + массив[j]
class Solution { public int[] twoSum(int[] nums, int target) { for(int i=0;i<nums.length;i++) { for(int j=0;j<nums.length;j++) { if(i == j) { break; } if(nums[i] + nums[j] == target) { return new int[] {i,j}; } } } return new int[] {0,0}; } }
Здесь моя простая логика такова: если мы получили i == j (то же значение), то просто разорвем этот цикл. И оставшийся элемент должен идти в соответствии с нашей логикой (цель = массив [i] + массив [j]) и возвращать два индекса, которые соответствуют нашей логике.
Но здесь проблема в том, что сложность этой программы составляет O(n²). Нам нужно уменьшить эту сложность.
Итак, я использовал Hashmap, чтобы уменьшить сложность.
import java.util.HashMap; class Solution { public int[] twoSum(int[] nums, int target) { HashMap <Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i=0;i<nums.length;i++) { if(map.containsKey(target - nums[i])) { return new int[] {i,map.get(target-nums[i])}; } map.put(nums[i], i); } throw new IllegalArgumentException("Nothing"); } }
Вот производительность второго кода.
Нажмите один раз, если вам нравится мой подход к решению и решение.
Спасибо за терпеливое чтение!!!