LeetCode刷题笔记#1 两数之和 twoSum

有人相爱,有人夜里看海,有人leetcode第一题做不出来

进入leetcode刷题算法阶段了,离学期结束不远了,写博客记录一下自己的成长,任务比较多。尽量坚持吧。
先上题目

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
You can return the answer in any order

C++ 解法1暴力

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
            int n=nums.size();
            for(int i=0;i<n;i++)
            {
                if(i+1<n)
                for(int k=i+1;k<n;k++)
                {
                    if(nums[i]+nums[k]==target)
                    return {i,k};
                }
            }
         return {};    
    }
};

不多说,直接二重循环嵌套暴力求解,最笨最直接的办法
leetcode给我们的预置代码中的这一行需要理解一下

vector<int> twoSum(vector<int>& nums, int target)

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。函数的返回值和参数中均有vector
因此我们直接利用nums.size返回对应数组长度
return{i,j}也是返回对应的vector的格式
在这里插入图片描述
C++解法二

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n=nums.size();
        unordered_map<int,int> hash;
        for(int i=0;i<n;i++)
        {
            int var=target-nums[i];
            if(hash.find(var)!=hash.end())
            return {hash.find(var)->second,i};
            hash[nums[i]]=i;
        }
        return {};
    }
};

本来是直接用map的,结果意识到不是顺序map不通过,看了一下官方代码用的unordered_map。哈希表算法很好理解,优化的地方在于查找部分,自己写的话写个二分查找对数组和map键值对的效果其实差不多。注意这里给hash给值的时候不是顺序map,key值就是数组的数值,value才是对应的index
然后注意一下给hash表存值的时候要在find后面,这是避免当target的值是对应值两倍的特殊情况

Java 解法一 暴力

class Solution {
    public int[] twoSum(int[] nums, int target) {
            int n=nums.length;
            for(int i=0;i<n;i++)
            {
                for(int k=i+1;k<n;k++)
                {
                    if(nums[i]+nums[k]==target)
                    {
                        return new int[]{i,k};
                    }
                }
            }
            return new int[0];

    }
}

在这里插入图片描述Java怎么可以这么快

Java解法二

class Solution {
    public int[] twoSum(int[] nums, int target) {
            HashMap<Integer, Integer> hash =new HashMap<Integer, Integer>();
            int n=nums.length;
            for(int i=0;i<n;i++)
            {
                int var=target-nums[i];
                if(hash.containsKey(var))
                return new int[] {hash.get(var),i};
                hash.put(nums[i],i);
            }
            return new int[0]; 

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值