在有序数组中求两数之和(leetcode167)

一:解题思路

方法一:暴力破解法,Time:O(n^2),Space:O(1)

方法二:利用一个哈希表,Time:O(n),Space:O(n)

方法三:利用二分的思想。Time:O(log(n)),Space:O(1)

二:完整代码示例 (C、C++、Java、Python)

方法一C:

int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
    
    int* result = (int*)malloc(sizeof(int)*2);
    int i = 0;
    int j = 0;
    for (i = 0; i < numbersSize; i++) {
        for (j = i+1; j < numbersSize; j++) {
            if (numbers[i] + numbers[j] == target) {
                result[0] = i + 1;
                result[1] = j + 1;
                break;
            }
        }
    }
    *returnSize = 2;

    return result;
}

方法二C:

方法三C:

int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
    
    int* result = (int*)malloc(sizeof(int)*2);
    int i = 0;
    int j = numbersSize-1;

    while (i < j) {
        if (numbers[i] + numbers[j] == target) {
            result[0] = i + 1;
            result[1] = j + 1;
            break;
        }
        else if (numbers[i] + numbers[j] < target) i++;
        else j--;
    }
    
    *returnSize = 2;

    return result;
}

 

方法一C++:

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> result(2,-1);
        if (numbers.size() == 0) return result;
        
        for (int i = 0; i < numbers.size(); i++) {
            for (int j = i + 1; j < numbers.size(); j++) {
                if (numbers[i] + numbers[j] == target) {
                    result[0] = i+1;
                    result[1] = j+1;
                    break;
                }
            }
        }

        return result;
    }
};

方法二C++:

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> result(2,-1);
        if (numbers.size() == 0) return result;
        map<int, int> hash_map;

        for (int i = 0; i < numbers.size(); i++) {
            int another = target - numbers[i];
            if (hash_map.count(another) > 0) {
                result[0] = hash_map[another]+1;
                result[1] = i + 1;
                break;
            }
            hash_map[numbers[i]] = i;
        }

        return result;
    }
};

方法三C++:

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> result(2,-1);
        int i = 0;
        int j = numbers.size() - 1;

        while (i <= j) {
            if (numbers[i] + numbers[j] == target) {
                result[0] = i+1;
                result[1] = j+1;
                break;
            }
            else if (numbers[i] + numbers[j] < target) i++;
            else j--;
        }

        return result;
    }
};

方法一Java:

class Solution {
        public int[] twoSum(int[] numbers, int target) {
               if (numbers == null || numbers.length == 0) return new int[]{-1,-1};

               for (int i=0;i<numbers.length;i++) {
                   for (int j=i+1;j<numbers.length;j++) {
                       if (numbers[i]+numbers[j] == target) {
                           return new int[] {i+1,j+1};
                       }
                   }
               }
               
               return new int[]{-1,-1};
        }
    }

方法二java:

class Solution {
        public int[] twoSum(int[] numbers, int target) {
                if (numbers == null || numbers.length == 0) return new int[]{-1,-1};
                Map<Integer,Integer> hash_map = new HashMap<>();
                
                for (int i=0;i<numbers.length;i++) {
                    int another = target-numbers[i];
                    if (hash_map.containsKey(another)) {
                        return new int[]{hash_map.get(another)+1,i+1};
                    }
                    hash_map.put(numbers[i],i);
                }
                
                return new int[]{-1,-1};
        }
    }

方法三Java:

class Solution {
        public int[] twoSum(int[] numbers, int target) {
               if(numbers == null || numbers.length == 0) return new int[]{-1,-1};
               int i=0;
               int j=numbers.length-1;
               
               while (i<j) {
                   if(numbers[i] + numbers[j] == target) {
                       return new int[] {i+1,j+1};
                   }
                   else if(numbers[i] + numbers[j] < target) i++;
                   else j--;
               }
               
               return new int[] {-1,-1};
        }
    }

 

方法一Python:

from typing import List
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        if not numbers :return
        length=len(numbers)
        result=[]
        for i in range(length):
            for j in range(i+1,length):
                if numbers[i]+numbers[j] == target:
                    result.append(i+1)
                    result.append(j+1)
                    break

        return result

 

方法二Python:

 

方法三Python:

from typing import List
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        if not numbers: return 
        result=[]
        length=len(numbers)
        i=0
        j=length-1
        while i<j:
            if numbers[i]+numbers[j] == target:
                result.append(i+1)
                result.append(j+1)
                break;
            elif numbers[i]+numbers[j] < target:
                i=i+1
            else:
                j=j-1
        
        return result
 
posted @ 2020-03-05 21:11  repinkply  阅读(295)  评论(0)    收藏  举报