Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2java
給定一個整數數組,找出其中兩個數知足相加等於你指定的目標數字。
要求:這個函數twoSum必需要返回可以相加等於目標數字的兩個數的索引,且index1必需要小於index2。請注意一點,你返回的結果(包括index1和index2)都不是基於0開始的。你能夠假設每個輸入確定只有一個結果。數組
建立一個輔助類數組,對輔助類進行排序,使用兩個指針,開始時分別指向數組的兩端,看這兩個下標對應的值是否等於目標值,若是等於就從輔助類中找出記錄的下標,構造好返回結果,返回。若是大於就讓右邊的下標向左移,進入下一次匹配,若是小於就讓左邊的下標向右移動,進入下一次匹配,直到全部的數據都處理完less
import java.util.Arrays; public class Solution { /** * 輔助類 */ private static class Node implements Comparable<Node> { int val; // 值 int idx; // 值對應的數組下標 public Node() { } public Node(int val, int idx) { this.val = val; this.idx = idx; } // 比較方法 @Override public int compareTo(Node o) { if (o == null) { return -1; } return this.val - o.val; } } /** * 001-Two Sum(求兩個數的和) * * @param nums 輸入數組 * @param target 兩個數相加的和 * @return 兩個數對應的下標 public int[] twoSum(int[] nums, int target) { // 用於保存返回結果 int[] result = {0, 0}; // 建立輔助數組 Node[] tmp = new Node[nums.length]; for (int i = 0; i < nums.length; i++) { tmp[i] = new Node(nums[i], i); } // 對輔助數組進行排序 Arrays.sort(tmp); // 記錄輔助數組中左邊一個值的下標 int lo = 0; // 記錄輔助數組中右邊一個值的下標 int hi = nums.length - 1; // 從兩邊向中間靠隴進行求解 while (lo < hi) { // 若是找到結果就設置返回結果,而且退出循環 if (tmp[lo].val + tmp[hi].val == target) { if (tmp[lo].idx > tmp[hi].idx) { result[0] = tmp[hi].idx + 1; result[1] = tmp[lo].idx + 1; } else { result[0] = tmp[lo].idx + 1; result[1] = tmp[hi].idx + 1; } break; } // 若是大於目標值,右邊的下標向左移動 else if (tmp[lo].val + tmp[hi].val > target) { hi--; } // 若是小於目標值,左邊的下標向右移動 else { lo++; } } return result; } }