11

想做一个算法,在leetcode上发现了这个问题

给定一个整数数组,找到两个数字,使它们加起来等于一个特定的目标数字。

函数 twoSum 应该返回两个数字的索引,以便它们相加到目标,其中 index1 必须小于 index2。请注意,您返回的答案(index1 和 index2)不是从零开始的。

您可以假设每个输入都只有一个解决方案。

输入:数字={2, 7, 11, 15},目标=9

输出:index1=1,index2=2

我的解决方案是 O(n^2)。我想知道是否有更好的方法来做到这一点?像 O(n) 或 O(nlogn)

import java.util.Arrays;
public class ReturnIndex {
    public int[] twoSum(int[] numbers, int target) {
        int tail = numbers.length-1;
        int[] n = new int[2];
        for (int i=0;i<tail;i++) {
            for(int j=i+1;j<tail;j++) {
                if(target ==(numbers[i]+numbers[j])) {
                    n[0] = i+1;
                    n[1] = j+1;
                }
            }
        }
        return n;
    }

    public static void main(String[] args) {
        int[] s = {150,24,79,50,88,345,3};
        int value = 200;
        ReturnIndex r = new ReturnIndex();
        int[] a = r.twoSum(s,value);
        System.out.println(Arrays.toString(a));
    }
}
4

26 回答 26

20

对数组进行排序。使两个指针指向第一个和最后一个(x 和 X)。循环运行:

if      (a[X]+a[x] >  N) then X-- 
else if (a[X]+a[x] <  N) then x++
else if (a[X]+a[x] == N) then found.

if (x > X) then no numbers exist.

O(nlogn)时间,O(1)记忆

于 2012-10-24T04:12:07.427 回答
12

O(n log n)时间,O(1)内存(不计算列表):

  1. 首先,对列表进行排序。这应该需要O(n log n)时间,就像大多数排序函数一样。

  2. 遍历列表,这应该O(n)在外循环中花费时间。此时,您可以在已排序的子列表中对最接近的匹配整数进行二进制搜索,这需要O(log n)时间。这个阶段应该结束O(n log n)

编辑:在下面查看 Max 的答案。它仍然是 O(n log n) 时间和 O(1) 内存,但他通过从列表的每一端遍历一个指针来避免二进制搜索。

O(n)时间,O(n)记忆:

建立一个哈希表,它应该有O(1)插入和O(1)包含。然后,O(n)在外循环中,对于每个 number i,检查是否total - i在哈希表中。如果没有,添加它;如果是这样,那么你有你的两个号码。

无论哪种方式,您都需要对数组进行额外的扫描以获取索引,但这没问题——它只需要O(n)时间。如果您想避免它,您可以根据需要将原始索引保留在排序列表或哈希表中,但这会占用内存而不是时间占用。

于 2012-10-24T04:12:42.743 回答
2

您可以在下面找到一个可以及时找到两个数字的解决方案O(n log n)

1- Sort the numbers in ascending (or descending) order             // O(n log n)

2- Compute diff = target - item for each item                      // O(n) 

3- For each calculated diff, look up the calculated value in the sorted items 
   using the Binary search algorithm                               // O(n log n) 

一个完整的、可用的 Java 实现:

import java.util.ArrayList;

public class NumbersFinder {

    class Item{
        private int value;
        private int index;

        public Item(int value, int index){
            this.value = value;
            this.index = index;
        }

        public int getValue(){
            return value;
        }

        public int getIndex(){
            return index;
        }
    }

    public ArrayList<Item> find(int[] values, int target){      
        ArrayList<Item> items = new ArrayList<Item>();
        for(int i = 0; i < values.length; i++)
            items.add(new Item(values[i], i));

        items = quicksort(items);
        ArrayList<Integer> diffs = computeDiffs(items, target);

        Item item1 = null;
        Item item2 = null;

        boolean found = false;

        for(int i = 0; i < diffs.get(i) && !found; i++){
            item1 = items.get(i);
            item2 = searchSortedItems(items, diffs.get(i), 0, items.size());
            found = item2 != null;
        }
        if(found){
            ArrayList<Item> result = new ArrayList<Item>();
            result.add(item1);
            result.add(item2);
            return result;
        }
        else
            return null;
    }

    // find "value" in the sorted array of "items" using Binary search in O(log n)
    private Item searchSortedItems(ArrayList<Item> items, Integer value, int lower, int upper) {
        if(lower > upper)
            return null;
        int middle = (lower + upper)/2;
        Item middleItem = items.get(middle);
        if(middleItem.getValue() == value)
            return middleItem;
        else if(middleItem.getValue() < value)
            return searchSortedItems(items, value, middle+1, upper);
        else
            return searchSortedItems(items, value, lower, middle-1);
    }

    // Simply calculates difference between the target value and each item in the array; O(n)
    private ArrayList<Integer> computeDiffs(ArrayList<Item> items, int target) {
        ArrayList<Integer> diffs = new ArrayList<Integer>();
        for(int i = 0; i < items.size(); i++)
            diffs.add(target - items.get(i).getValue());
        return diffs;
    }

    // Sorts items using QuickSort algorithm in O(n Log n)
    private ArrayList<Item> quicksort(ArrayList<Item> items) {
        if (items.size() <= 1)
            return items;
        int pivot = items.size() / 2;
        ArrayList<Item> lesser = new ArrayList<Item>();
        ArrayList<Item> greater = new ArrayList<Item>();
        int sameAsPivot = 0;
        for (Item item : items) {
            if (item.getValue() > items.get(pivot).getValue())
                greater.add(item);
            else if (item.getValue() < items.get(pivot).getValue())
                lesser.add(item);
            else
                sameAsPivot++;
        }
        lesser = quicksort(lesser);
        for (int i = 0; i < sameAsPivot; i++)
            lesser.add(items.get(pivot));
        greater = quicksort(greater);
        ArrayList<Item> sorted = new ArrayList<Item>();
        for (Item item : lesser)
            sorted.add(item);
        for (Item item: greater)
            sorted.add(item);
        return sorted;
    }


    public static void main(String[] args){
        int[] s = {150,24,79,50,88,345,3};
        int value = 200;

        NumbersFinder finder = new NumbersFinder();
        ArrayList<Item> numbers = finder.find(s, value);

        if(numbers != null){
            System.out.println("First Number Found = " + numbers.get(0).getValue() + " ; Index = " + + numbers.get(0).getIndex());
            System.out.println("Second Number Found = " + numbers.get(1).getValue() + " ; Index = " + + numbers.get(1).getIndex());
        }
        else{
            System.out.println("No such two numbers found in the array!");
        }
    }
}

输出:

First Number Found = 50 ; Index = 3
Second Number Found = 150 ; Index = 0
于 2012-10-24T04:17:20.153 回答
1

这是一个 O(n):

public int[] findSumMatched(int[] numbers, int target) {
    Map<Integer, Integer> mapOfNumbers = new HashMap<Integer, Integer>();
    for (int i = 0; i<numbers.length; i++) {
        int secondNumber = target - numbers[i];
        if (mapOfNumbers.get(secondNumber) != null){
            return new int[] {mapOfNumbers.get(secondNumber), i};
        }
        mapOfNumbers.put(numbers[i], i);
    }
    throw new IllegalArgumentException();
}
于 2020-08-02T01:28:27.997 回答
1

可以提供一个O(n)的时间解,但是他的记忆力不可能是O(1)

首先声明一个键值对,其中 key 是整数数组中的值,value 是整数数组中的索引。而且,您需要声明一个哈希表来保存键值对。然后你需要遍历整个整数数组,如果这个数组的值(=sum - array[i])在哈希表中,恭喜你找到了,如果没有,则存储在哈希表中。

所以花费的全部时间就是插入和查询哈希表的时间。内存是哈希表的大小。

我的英文不是很好,希望能帮到你。

public static void main(String args[]) {
    int[] array = {150,24,79,50,88,345,3};
    int sum = 200;


    Map<Integer,Integer> table = new HashMap<>();
    StringBuilder builder = new StringBuilder();
    for(int i=0;i<array.length;i++){
        int key = sum - array[i];
        if(table.containsKey(key)){
            builder.append("index1=").append(table.get(key)).
                    append(" index2=").append(i);
        }else{
            table.put(array[i],i);
        }
    }
    System.out.println(builder);
}

于 2018-12-27T09:59:43.970 回答
1

二和问题的简单解决方案是O(n^2), stn是提供的数字数组的长度。

但是,我们可以通过使用到目前为止看到的值的哈希映射(key=number,value=index)并在O(1)迭代数字时检查补码是否已经存在()来做得更好。这种方法对于未排序的数组是最优的:

  • 运行时复杂度:O(n)
  • 空间复杂度:O(n)——虽然如果有一个解决方案,在实践中这将是O(n/2)

鉴于OP的问题:

  • 没有指定输入数组是否已排序(因此,可以安全地假设输入数组可以是任何东西),并且
  • 特别要求提供数组的索引,而不是实际数字,任何排序数组的解决方案都需要事先复制它,在排序数组和未排序数组之间保留索引映射,或者遍历原始数组,因此会根据所选择的方法消耗内存 ( O(n)) 或时间 ( )。因此,严格来说,(当前)接受O(n)的解决方案的第一部分是不正确的。

最佳解决方案:

  • 在 Python 中:
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        seen = {}
        for j, num in enumerate(nums):
            i = seen.get(target-num, -1)
            if i != -1:
                return [i+1, j+1]
            seen[num] = j
        return [-1, -1]
  • 在 Java 中:
import java.util.Map;
import java.util.HashMap;

public class Solution {
    public int[] twoSum(int[] nums, int target) {
        final Map<Integer, Integer> seen = new HashMap<>();
        for (int j = 0; j < nums.length; ++j) {
            final Integer i = seen.get(target - nums[j]); // One hash-map access v.s. two when using contains beforehand.
            if (i != null) {
                return new int[]{ i+1, j+1 };
            }
            numbers.put(nums[j], j);
        }
        return new int[]{-1, -1};
    }
}

请注意,通过构造,如果补码存在于地图/字典中,则存储的索引将始终低于当前索引。因此以下命题得到验证:

index1 必须小于 index2

另请注意,OP 的问题需要基于 1 的索引,这是我在上面提供的,但提到的 Leetcode 问题似乎从那时起已经更新,现在是基于 0:https ://leetcode.com/问题/二和

我希望这有帮助。

于 2020-01-25T05:07:34.130 回答
1
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        out_list=[] 
        for i in range(len(nums)):
            for j in range(len(nums)):
                if(target-nums[i]) == nums[j] and i != j:
                    out_list.append(i)
        return out_list
于 2021-02-19T18:06:16.507 回答
1

正如上面提到的@Prayer,这是公认的答案。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] resultarray=new int[2];
        for (int i=0;i<nums.length-1;i++){
            for(int k=i+1;k<nums.length;k++)
            {
                 if(target==nums[i]+nums[k])
                 {
                     resultarray[0]=i;
                     resultarray[1]=k;
                 }
            }
        }
        return resultarray;
    }
}
于 2019-07-24T04:07:06.543 回答
1

python中的一行解决方案:

class Solution(object):
    """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
    """
    def twoSum(self, nums, target):            
        x = [[i, nums.index(target-j)] for i,j in enumerate(nums) if nums.count(target-j) > 0 and nums.index(target-j)!=i]

        return x.pop()
于 2016-09-13T11:48:35.910 回答
0

我会这样处理:

  1. 将您的数组从小到小排序

  2. 以您拥有的方式循环您的数组,但只要提前退出循环

    目标<(数字[i]+数字[j])

  3. 一旦获得了两个元素的值,例如 n[0] + n[1] = target,请回头查看原始数组以找到它们的索引。

于 2012-10-24T04:10:33.060 回答
0

这是我的 O(nlog(n)) 的 cpp 解决方案:

vector<int> two_sum(vector<int> &numbers, int target) {
    vector<int> result;
    vector<int> numbers_dup = vector<int>(numbers);

    sort(numbers_dup.begin(), numbers_dup.end());

    int left = 0, right = numbers_dup.size() - 1;
    while(left <= right) {
        int sum = numbers_dup[left] + numbers_dup[right];

        if(sum == target) {
            //find the idex of numbers_dup[left] and numbers_dup[right]
            for(int i = 0; i < numbers.size(); i++) {
                if(numbers[i] == numbers_dup[left] || numbers[i] == numbers_dup[right]) {
                    result.push_back(i);
                }
                if(result.size() == 2) {
                    return result;
                }
            }
        }
        else if(sum > target) {
            right--;
        }
        else {
            left++;
        }
    }
}

查看我的博客以获取详细说明。 https://algorithm.pingzhang.io/Array/two_sum_problem.html

于 2016-10-02T02:00:07.917 回答
0
  1. 以非降序对列表进行排序。这需要O(nlogn)时间复杂度。
  2. 找到这两个数字,可以及时完成O(n)
  3. 找到两个数的两个索引,可以及时完成O(n)

总体复杂度为O(nlogn).

在python中的实现:

class Solution:
  def twoSum(self, nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    p = nums[:]
    p.sort() #sorting in -> O(nlogn)
    r = len(nums)-1
    l =0 

    #find the indices -> O(n)
    for i in range(len(nums)):
      if(p[l] + p[r]<target): 
        l += 1
      elif (p[l] + p[r]>target): 
        r -=1
      else :
        first_num = p[l]
        second_num = p[r]

    #find the indices of the numbers -> O(n)
    for i in range(len(nums)):
      if(nums[i]==first_num):
        first_index = i
      elif (nums[i]==second_num):
        second_index = i
    return [first_index,second_index]
于 2018-02-27T07:22:48.760 回答
0
class Solution {
public int[] twoSum(int[] nums, int target) {
    int[] sortedNums = Arrays.copyOf(nums, nums.length);
    Arrays.sort(sortedNums);
            
    int leftSortedIndex = 0;
    int rightSortedIndex = sortedNums.length - 1;
    
    while(leftSortedIndex < rightSortedIndex) {
        int sum = sortedNums[leftSortedIndex] + sortedNums[rightSortedIndex];
        if(sum == target) {
            break;
        } else if(sum < target) {
            leftSortedIndex++;
        } else {
            rightSortedIndex--;
        }
    }
            
    int leftIndex = -1;
    int rightIndex = -1;
    for(int index=0; index < nums.length; index++) {
        if(leftIndex == -1 && nums[index] == sortedNums[leftSortedIndex]) {
            leftIndex = index;
            continue;
        }
        
        if(rightIndex == -1 && nums[index] == sortedNums[rightSortedIndex]) {
            rightIndex = index;
        } 
    }
    
    
    return (new int[] {leftIndex, rightIndex});
}

}

于 2021-06-28T06:46:33.587 回答
0
class Solution {
public int[] twoSum(int[] nums, int target) {
    int[] sortedNums = Arrays.copyOf(nums, nums.length);
    Arrays.sort(sortedNums);
            
    int leftSortedIndex = 0;
    int rightSortedIndex = sortedNums.length - 1;
    
    while(leftSortedIndex < rightSortedIndex) {
        int sum = sortedNums[leftSortedIndex] + sortedNums[rightSortedIndex];
        if(sum == target) {
            break;
        } else if(sum < target) {
            leftSortedIndex++;
        } else {
            rightSortedIndex--;
        }
    }
            
    int leftIndex = -1;
    int rightIndex = -1;
    for(int index=0; index < nums.length; index++) {
        if(leftIndex == -1 && nums[index] == sortedNums[leftSortedIndex]) {
            leftIndex = index;
        } else if(rightIndex == -1 && nums[index] == sortedNums[rightSortedIndex]) {
            rightIndex = index;
        }
    }
    
    
    return (new int[] {leftIndex, rightIndex});
}

}

于 2021-06-28T06:52:22.663 回答
0

只是好奇,但是这个 O(n) 解决方案有什么问题?

public int[] twoSum(int[] nums, int target) {
    for (int i = 0; i < nums.length - 1; i++){
        if (nums[i] + nums[i+1] == target)
            return new int[] {i, i+1};
    }
    return null;
}
于 2020-07-30T23:16:58.430 回答
0

我们可以用 HashMap 来做,时间复杂度是 O(n)

public class ReturnIndicesOfElementsAddToSum {

public static void main(String[] args) {
    int[] nums = {2, 7, 11, 15};
    int target = 18;

    if(!getIndices(nums,target)) {
        System.out.println("No such numbers found");
    }

}

static boolean getIndices(int[] nums, int target) {
    Map<Integer,Integer> indexMap = new HashMap<>();
    boolean numFound = false;
    for(int i=0;i<nums.length;i++) {
        int temp = target - nums[i];
        indexMap.put(nums[i], i);
        if(indexMap.containsKey(temp)) {
            System.out.printf("%d and %d adds upto the target value and indices are %d and %d"
                            , nums[i], temp, i, indexMap.get(temp));
            numFound = true;
        }
    }
    return numFound;
}

}

于 2020-05-17T18:46:45.460 回答
0

这是一个有效的解决方案。

时间复杂度 - O(n)空间复杂度 - O(1)

Sol:将采用两个指针(start_pointer 和 end_pointer)。最初 start_pointer 指向第一个索引,end_pointer 指向最后一个。

添加两个元素(sum = array[start_pointer] + array[last_pointer]。之后检查,如果sum > target元素。如果是,则减少end_pointer否则增加start_pointer。如果sum = target,意味着你得到了索引。

public int[] twoSum(int[] numbers, int target) {

    int[] arr = new int[2]; // to store result
    int sum=0;

    int start_pointer=0;     
    int end_pointer = (numbers.length)-1;

    while(start_pointer<=end_pointer){

        sum=numbers[start_pointer]+numbers[end_pointer]; 

        if(sum>target)
            end_pointer-=1;
        else if(sum<target)
            start_pointer+=1;
        else{
            arr[0]=start_pointer;
            arr[1]=end_pointer;
            break;
        }       
    }       
    return arr;
}
于 2020-03-27T15:07:45.997 回答
0

c++ 中使用哈希映射的 O(n) 解决方案仅利用实数加法的交换规则。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> my_map;
          for ( int i = 0 ; i < nums.size(); i++ ){
                if(my_map.find(target - nums[i]) != my_map.end()){
                    return vector<int> {my_map[target - nums[i]], i};
                }  
                my_map[nums[i]] = i ;
          }
    }
};
于 2018-12-27T08:53:00.837 回答
0

使用 HashMap 这也是一个解决方案,如果在 HashMap 中搜索的复杂性将按 O(logn) 的顺序排列,那么在最坏的情况下,复杂性将是O(nlogn)

    public int[] twoSum(int[] nums, int target) {
        
        int [] resultIndex = null;
        
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        
        for(int i=0;i<nums.length;i++){
            int temp = target - nums[i];
            
            if(map.containsKey(temp)){
                resultIndex = new int[2];
                resultIndex[0]=map.get(temp);
                resultIndex[1]=i;
            }else{
                map.put(nums[i],i);
            }
        }
        return resultIndex;
    }
于 2020-07-08T12:21:18.967 回答
0

我尝试了大多数答案,但他们似乎没有正确处理边缘情况。因此,为处理边缘情况的 python3 解决方案投入了两分钱。我使用 Max 的算法来实现它:

   def twoSum(nums, target):
    output=[]
    arr=sorted(nums)
    x=0
    y=-1
    X=len(nums)-1
    while x<X:
        if (arr[X]+arr[x] >  target):
            X-=1 
        elif (arr[X]+arr[x] <  target):
            x+=1
        elif (arr[X]+arr[x] == target):
            #print("Found",arr[X],arr[x])
            num1=arr[x]
            num2=arr[X]
            x+=1
            X-=1 
    for i in range(len(nums)):
        if num1 == nums[i] and y==-1:
            index1=i
            y=i
        elif num2 == nums[i]:
            index2=i         
    return [index1, index2]

注意重要的是要考虑边缘情况和输入,如下所示

print(twoSum([3,2,4],  6)) # [1,2]
print(twoSum([3,3],  6))  # [0,1]
于 2019-10-11T02:41:27.247 回答
0
 public static int[] twoSum(int[] nums, int target) {
        int []resultarray=new int[2];
        for (int i=0;i<nums.length-1;i++){
            for(int k=1;k<nums.length;k++)
            {
                 if(target==nums[i]+nums[k])
                 {
                     resultarray[0]=nums[i];
                     resultarray[1]=nums[k];
                 }
            }
        }
 return resultarray;
    }
于 2017-08-14T10:48:12.427 回答
0

我对这个问题的解决方案是,

public int[] twoSums(int[] unsortedNum, int target) {
        int[] nums = Arrays.copyOf(unsortedNum, unsortedNum.length);
        Arrays.sort(nums);
        boolean isResultFound = false;
        int start = 0;
        int end = nums.length-1;
        while(!(start > end)) {
            if(nums[start]+nums[end] > target){
                end--;
            } else if (nums[start]+nums[end] < target){
                start++;
            } else if(nums[start] + nums[end] == target){
                isResultFound = true;
                break;
            }
        }
        if(isResultFound){
            int s = -1;
            int e = -1;
            for(int i = 0; i< unsortedNum.length; i++){
                if(s != -1 && e != -1){
                    break;
                }
                if(s == -1 && unsortedNum[i] == nums[start]){
                    s = i;
                } else if(e == -1 && unsortedNum[i] == nums[end]) {
                    e = i;
                }
            }
            return new int[] {s,e};
        }
        // for element not found
        return new int[]{-1,-1};
    }

最后,如果你得到 -1, -1 作为索引,那么你可以说没有找到的元素可以和目标元素相加。

于 2020-12-14T21:51:08.850 回答
0

这是我的python解决方案

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """

        copy_dict = {}
        for pos in range(0, len(nums)):
            if nums[pos] not in copy_dict.keys():
                copy_dict[nums[pos]] = [pos]
            else:
                copy_dict[nums[pos]].append(pos)

        def get_sum_indexes(sorted_array, target):
            right_pointer = len(sorted_array) - 1
            left_pointer = 0
            while left_pointer < len(sorted_array) or right_pointer > 0:
                if sorted_array[right_pointer] + sorted_array[left_pointer] == target:
                    return [sorted_array[left_pointer], sorted_array[right_pointer]]
                elif sorted_array[right_pointer] + sorted_array[left_pointer] > target:
                    right_pointer -= 1
                elif sorted_array[right_pointer] + sorted_array[left_pointer] < target:
                    left_pointer += 1
            return None
        sum_numbers = get_sum_indexes(sorted(nums), target)
        if len(copy_dict[sum_numbers[0]]) == 1:
            answer_1 = copy_dict[sum_numbers[0]][0]
        else:
            answer_1 = copy_dict[sum_numbers[0]][0]

        if len(copy_dict[sum_numbers[1]]) == 1:
            answer_2 = copy_dict[sum_numbers[1]][0]
        else:
            answer_2 = copy_dict[sum_numbers[1]][1]
        return sorted([answer_1, answer_2])

print(Solution().twoSum(nums=[-1, -2, -3, -4, -5], target=-8))
print(Solution().twoSum(nums=[-3, -3], target=-6))
于 2017-12-19T20:51:28.623 回答
0

如果有人想要C,这可能会有所帮助......它是蛮力而不是哈希表!

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int i,j,l,target,m,n;
    printf("Enter how many elements you want :\n");
    scanf("%d",&i);
    int array[i];

    printf("Input elements\n" );
    for (j=0;j<i;j++)
    scanf("%d",&array[j]);
    
    printf("[");
    for (l=0;l<i;l++)
    printf(" %d ",array[l] );
    printf("]\n");

    printf("Input the target :");
    scanf("%d",&target);

    for (m=0;m<i;m++)
    {
        for (n=m+1;n<i;n++)
        {
            if ((array[m]+array[n])==target)
            {
                printf("Their indices is \n[%d,%d]",m,n);
            }
        }
    }
    
    return 0;
}
于 2021-09-07T11:21:24.210 回答
0

时间复杂度 O(n) 和空间复杂度 O(n) 的 Swift 代码:

import UIKit

class Solution{
    func twoSum(_ nums: [Int], _ target: Int) -> [Int]{
        var finalArray = [Int]()
        var newDictionary = [Int:Int]()
        for i in 0..<nums.count{
            let complement = target - nums[i]
            if newDictionary[complement] != nil && newDictionary[complement] != i{

                finalArray.append(newDictionary[complement]!)
                finalArray.append(i)
                return finalArray
            }
            newDictionary[nums[i]] = i

        }
        return []
    }
}

func main(){

    let solution = Solution()
    print("All Good" ,solution.twoSum([1, 3, 4 , 5], 6))
}

main()
于 2018-10-25T05:51:44.987 回答
0

这是在 java 中使用 HashMap 并通过两次数组传递的答案。假设数组中没有重复的元素并且只存在一个解决方案。

import java.util.HashMap;

public class TwoSum {

    int[] index = new int[2];
    public int[] twoSum(int[] nums, int target)
    {
        int length = nums.length;
        //initialize return values assuming that pair for the given target
        //doesn't exist
        index[0]=-1;
        index[1]=-1;
        //sanity check
        if(length<1) return index;

        HashMap<Integer, Integer> numHash = new HashMap<>(length);
        //get the values from array into HashMap assuming that there aren't duplicate values
        for(int i=0; i<length;i++)
        {
            numHash.put(nums[i],i);
        }

        //check for the value in the array and the difference between target and it. Assume that only
        //one such pair exists
        for(int i=0;i<length;i++)
        {
            int val1 = nums[i];
            int val2=target-val1;
            //make sure that it doesn't return the index of the first number in the pait you are searching for
            if( numHash.containsKey(val2) && numHash.get(val2)!=i){
                index[0]=i;
                index[1] =numHash.get(target-nums[i]);
                break;
            }
        }
        return index;
    }
}
于 2017-08-07T04:02:04.670 回答