LeetCode_1:Two Sum(abandon)

**
泰戈尔说,你今天受的苦,吃的亏,担的责,扛的罪,忍的痛,到最后都会变成光照亮你的路。LeetCode在我这里像是一本枯燥的题库,说实话我对这个不是很感兴趣,但是它是我实现目标的重要一步,因此我必须认真对待。先给自己定一个目标,来激励自己,在找到好的工作,或者目标工作之前,每天更新一至两道题,只谈自己的做题感受和记录学到的知识点。
注:我主要学习C++和Python的解题方法,暂时理解是这两种语言应该是我接下来会重点用的语言,我希望能在我的简历上写上,熟练掌握,而不是学习过。**

开始做题

==
方法一:python用list来做
成绩:1208ms/14.7mb
思路:1)数组长度先用个变量表示。2)j=-1是为了后面进行一个判断,有没有这样一组num1和num2的组合加起来是target。3)一个for循环,用一个变量i来遍历这个数组,范围range在最大数组长度以内。4)用if进行一个判定,就是拿第i个数作为num1时候,是否存在一个num2加起来是target。5)如果存在那个num2的话,我们再用一个if进行&联合判断,是不是num2=num1,且数组里面num1和num2就是一个数而不是两个相同的数。如果是的话不符合数组中同一个元素不能使用两遍的规则,直接通过continue跳出本次循环,如果不是,那么从i后面的数找一下num2,并记录一下num2的下标j。6)对应第二条,拿j是否大于0做一个判定,进行结果的输出。==

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        lens = len(nums)
        j = -1
        for i in range(lens):
            if (target - nums[i]) in nums:
                if (nums.count(target - nums[i]) == 1)&(target - nums[i] == nums[i]):
                    continue
                else:
                    j = nums.index(target - nums[i], i+1)
                    break
        if j > 0:
            return [i, j]
        else:
            return []

方法二:C++暴力法
成绩:428ms/7.1mb
思路:C++暴力的双重for循环直接实现,较为新颖的点有i=0,i<len-1;j=i+1,j<len。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
          int len = nums.size();

        for(int i = 0; i < len-1; i++)
        for(int j = i + 1; j < len; j++)
        {
            if(nums[i] + nums[j] == target)
            return {i,j};
        }
          return {};
    }
};

方法三:一次哈希表法
成绩:8ms/8.3mb
思路:.find函数进行对哈希表num2的查询,如果没有则会输出m.end,所以不等于m.end,那么就是查到了num2,直接返回num1和num2的下标, m[target-nums[i]]为已经加入map的元素的下标,所以小于本轮循环中的i,i则为num2的下标。

 class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
 unordered_map<int,int> m;
        
        for(int i = 0; i < nums.size(); i++)
        {
            if(m.find(target-nums[i]) != m.end())      //m中存在对应的键值
                return {m[target-nums[i]], i};        
            //  m[target-nums[i]]为已经加入map的元素的索引,所以小于本轮循环中的i,放在前面

            m[nums[i]] = i;       //向map中添加元素
        }
        return {};
        }
};

方法四:Python字典模拟哈希求解
成绩:92ms/15.1mb
思路:跟方法三一样的思路,只是语言换成Python

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap={}
        for i,num in enumerate(nums):
            if hashmap.get(target - num) is not None:
                return [hashmap.get(target - num),i]

            hashmap[num] = i #这句不能放在if语句之前,解决list中有重复值或target-num=num的情况

任务完成感受:1.人家的代码,手打一遍,相当于过一下人家的思路,会比看一遍清晰的多。
2.Python的for循环没有C++的for循环暴力,还是来的温柔了些,具体说就是C++的for循环可以写的参数多。
3.C++语言复杂难懂,但是执行效率和占用内存都比Python强的多,Python就是好写。。。
4.接下来的每日做题不能这么细致,要不绝对坚持不下来,要限制时间,C++和Python一种解法学一个最好的就行,不要细致研究了,主要练习优秀编程技术,每天学的量少一点但是能记住,增强积极性和降低坚持难度。
知识点:1.C++的哈希表,Python中是用字典来代替的,哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。
2.len函数是返回数组的长度的
3.count函数是统计字符串里某个字符出现的次数
4.index函数是检测字符串中是否包含子字符串,并返回下标
5.enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
6.find函数是检测检测字符串中是否包含子字符串,并返回下标,如果没有检测到则返回最后一个值,即.end。
核心考察
哈希表,典型的用空间换时间的一种算法。Python中用字典,相当于Python中的哈希表。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值