算法30天——day1,2

  • 因为最近开始准备暑期实习,大多投的是数据分析和机器学习算法岗,免不了要进行笔试环节。这才惊觉自己的算法基础太差了。要是一个个去看也太慢了,还是刷题加查阅资料效率高一点,故在此博客记录自己的算法30天,每天至少一题,如果题型简单的话,多刷几天,不一定天天更新,但是和大家分享一下自己刷题的心路历程,以及自己在解题时的疑惑,能给大家一点帮助就最好不过了。所有算法题目均来自于leetcode题库,使用语言为python3。

1.两数之和

a.题目内容

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

b.解题思路

  • 最终要返回符合条件两数的下标,必须先得到其下标。利用哈希表,将其值作为键,下标作为对应键值。首先判断数组长度是否合格,通过枚举函数得到数组的值及下标,每次循环都添加字典键值。

c.代码展示

class Solution:
    def twoSum(self, nums, target):
        if len(nums)<=1:
            return -1
        d = {}
        for i,x in enumerate(nums):
            if target - x in d:
                return([d[target-x],i])
            else:
                d[x] = i 

2.无重复字符的最长子串

a.题目内容

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

b.解题思路

输出为子串长度,也就是对应字符的下标之差。又要求下标?是不是觉得很熟悉,对,继续采用哈希表的方法,将其值作为键,下标作为对应键值。字串相当于一个窗口,窗口长度等于右边减左边,当右窗口不停向右移动,在检测到重复字符后,重新刷新窗口起始位置作为下一个检测窗口的开始,同时记录之前的最大窗口长度,和后面的进行比较。

c.代码展示

class Solution:
    def lengthOfLongestSubstring(self, s) :
        max_len = 0
        if s is None and len(s)==0:
            return max_len
        start = 0
        d ={}
        for i,x in enumerate(s):
            if  x in d and d[x] >= start:
                start = d[x] +1
            d[x] = i
            max_len = max(max_len,i+1-start)
        return max_len

3.总结

刚好做了这两个题,发现都是输出跟下标有关,序列长度 = 最右元素下标-最左元素下标,个人觉得在遇到同样问题时要知道用哈希表,可以解决很多问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值