30
loading...
This website collects cookies to deliver better user experience
Given an array of integers and an integer target, return indices of the two numbers such that they add up to the target.
// input
int[] data = {1, 3, -1, 5, 8, 10};
int sum = 9;
// output
int[] solution = {0, 4};
0
and 4
, sum up to the searched value 9
.public static int[] findSumTwo(int[] data, int sum) {
// iterate until the next to last element
for (int i = 0; i < data.length-1; i++) {
// iterate to the last element, starting from the second element
for (int j = 1; i < data.length; j++) {
// (the double loop will start from the
// {0, 1} index pair and stop iterating at {n-1, n})
// if the elements add up, return their indices
if (data[i]+data[j] == sum) return new int[]{i,j};
}
}
// not found
return new int[]{-1};
}
O(N^2)
) since we could be looking for 18
, and the result would be the last two numbers in the array.{1, 3, -1, 5, 8, 10}
, after each element, we can store the difference to the sum; given the desired value of 9
, we can add the following to a set.9-1 = 8
9-3 = 6
9-(-1) = 10
9-5 = 4
9-8
...8
at position 4, we can determine that it forms a solution pair since it already exists in our set (position 0).HashMap<Integer, Integer>
data structure or by using an extra int[]
array.public static int[] findSumTwo(int[] data, int sum) {
// value->index map
Map<Integer, Integer> seen = new HashMap<>();
// iterate through the array once (O(N))
for (int pos=0; i < data.length; i++) {
// assigning the element for convenience
// because it reads better
int element = data[i];
// if we've already seen the current element
if (seen.containsKey(element)) {
// form a solution
return new int[]{seen.get(element), pos};
}
// otherwise mark its difference as 'seen'
seen.put(sum-element, i);
}
// not found
return new int[]{-1};
}
seen
map.left
) and one at the end (right
), we could be sure that incrementing the left index or decrementing the right index would result in either a larger sum or a lower sum, respectively.left + right = found
, by comparing found
to sum
, we would know that the searched element needed to be larger, smaller, or the one we were looking for.public static int[] findSumTwo(int[] data, int sum) {
int left=0;
int right=data.length-1;
// only iterate until the positions are valid
// O(N)
while (left < right) {
int found = data[left] + data[right];
if (found == sum) {
// we have found a solution
return new int[]{left, right};
} else if (found < sum) {
// we need a larger number
left++;
} else {
// or a lower one
right--;
}
}
// not found
return new int[]{-1};
}
// most sorting algorithms run in O(N*lgN) time
Arrays.sort(data);
// empty input
int[] data = {};
int sum = /*irrelevant*/;
// null input
int[] data = null;
int sum = /*irrelevant*/;
// overflow
int[] data = {Integer.MAX_VALUE, Integer.MAX_VALUE};
int sum = -2; // doesn't seem correct, but it is given the Integer input
// not enough elements
int[] data = {9};
int sum = 9; // we need at least two elements for a valid solution
// equal elements
int[] data = {8,8};
int sum = 16; // this would cause the first solution to wrongly return {0,0}
// unsorted input
int[] data = {3,1};
int sum = 4; // the correct solution is {0,1}
// no solution
int[] data = {1,1};
int sum = 3; // no pair can sum up to 3