zoukankan      html  css  js  c++  java
  • leetcode——1

    1. 题目  Two Sum

    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=2

    给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。

    要求:这个函数twoSum必须要返回能够相加等于目标数字的两个数的索引,且index1必须要小于index2。请注意一点,你返回的结果(包括index1和index2)都不是基于0开始的。

    你可以假设每一个输入肯定只有一个结果。

    2. c++解题

    2.1  两层循环,时间复杂度为o(n^2),空间复杂度为o(1)

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

    2.2 哈希,时间复杂度为o(n),空间复杂度为o(n)

    class Solution {
    public:
        vector<int> twoSum(vector<int> &numbers, int target) {
            vector<int> result;
            map<int, int> m;
            if (numbers.size() < 2)
                return result;
            for (int i = 0; i < numbers.size(); i++)
                m[numbers[i]] = i;
    
            map<int, int>::iterator it;
            for (int i = 0; i < numbers.size(); i++) {
                if ((it = m.find(target - numbers[i])) != m.end())
                {
                    if (i == it->second) continue;
                    result.push_back(i+1);
                    result.push_back(it->second+1);
                    return result;
                }
            }
            return result;
        }
    };



    3. python 解题

      将原来的数组深拷贝一份,然后排序---然后在排序后的数组中找两个数使它们相加为target:使用两个指针,一个指向头,一个指向尾,两个指针向中间移动并检查两个指针指向的数的和是否为target。如果找到了这两个数,再将这两个数在原数组中的位置找出来就可以了---要注意的一点是:在原来数组中找下标时,需要一个从头找,一个从尾找,要不无法通过。如这个例子:numbers=[0,1,2,0]; target=0。如果都从头开始找,就会有问题。

    3.1

    class Solution:
        # @return a tuple, (index1, index2)
        def twoSum(self, num, target):
            index = []
            numtosort = num[:] //深拷贝
         numtosort.sort()
            i = 0; j = len(numtosort) - 1
            while i < j:
                if numtosort[i] + numtosort[j] == target:
                    for k in range(0,len(num)):
                        if num[k] == numtosort[i]:
                            index.append(k)
                            break
                    for k in range(len(num)-1,-1,-1):
                        if num[k] == numtosort[j]:
                            index.append(k)
                            break
                    index.sort()
                    break
                elif numtosort[i] + numtosort[j] < target:
                    i = i + 1
                elif numtosort[i] + numtosort[j] > target:
                    j = j - 1

            return (index[0]+1,index[1]+1)

    3.2 字典

    class Solution:
        # @return a tuple, (index1, index2)
        def twoSum(self, num, target):
            dict = {}
            for i in range(len(num)):
                x = num[i]
                if target-x in dict:
                    return (dict[target-x]+1, i+1) //找到,返回两数的下标
                dict[x] = i

    4. JAVA 哈希

    public class Solution {
        public static int[] twoSum(int[] numbers, int target) {
            int[] res = new int[2];
            HashMap<Integer, Integer> nums = new HashMap<Integer, Integer>();
    
            for (int i = 0; i < numbers.length; ++i) {
                // add i-th number
                Integer a = nums.get(numbers[i]);
                if (a == null)
                    nums.put(numbers[i], i);
    
                // find (target - numbers[i])
                a = nums.get(target - numbers[i]);
                if (a != null && a < i) {
                    res[0] = a ;
                    res[1] = i ;
                    break;
                }
            }
            return res;
        }
    }
    
    
  • 相关阅读:
    搭建kafka集群
    fluentd 安装、配置、使用介绍
    彻底解决 es 的 unassigned shards 症状
    nginx 反向代理时丢失端口的解决方案
    kubernetes的imagePullSecrets如何生成及使用
    创建MySQL数据库账号
    Linux中查找文件
    Linux快速访问多个目录
    Django查询数据库返回字典dict数据
    linux 将压缩包复制到另外一个文件夹下面
  • 原文地址:https://www.cnblogs.com/zxqstrong/p/4561368.html
Copyright © 2011-2022 走看看