LeetCode(力扣)做题系列 (,,´•ω•)ノ"(´っω•`。) T1--T5(Python)

T1 两数之和

题目:

 

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 

class Solution:
    def twoSum(self, nums: List[int], target: int):
        for i in range(len(nums)):
            temp=nums[:i]
            if (target-nums[i]) in temp:
                j=temp.index(target-nums[i],0,len(temp),)
                return j,i
            

思路:法1.暴力,超时警告。。。

           法2.py语言自带的小技巧

                   in  存在列表  index 定位

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------

T2  两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

# Definition for singly-linked list.
#class ListNode:
#    def __init__(self, x):
#        self.val = x
#        self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode :
        head=ListNode(0)      #一位一位相加,最后检查是否有进一位的1,效率较低,空间较大,待优化
        h=head
        sign=0
        while l1 or l2:
            sum=0
            if l1:
                sum+=l1.val
                l1=l1.next
            if l2:
                sum+=l2.val
                l2=l2.next
            if sign==1:
                sum+=1
                sign=0
            if sum>=10:
                sign=1
                sum=sum-10
                h.next=ListNode(sum)
            else:
                h.next=ListNode(sum)
            h=h.next
        if sign==1:
            h.next=ListNode(1)
            h=h.next
        return head.next

思路:Python使用class构建链表,之前链表等都是C写的,这里比较新颖,思路就是一位一位取出相加,得10则进一位,这里考虑了一些特殊情况,算法实现的不够普适。

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 

T3  无重复字符的最长子串

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

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if s=="":
            return 0
        max_len=1
        lens=len(s)
        left=0
        right=1
        while rightmax_len:
                max_len=t_len
            right+=1
        return max_len
                
                
                
        
                

思路:双指针,一左一右,固定住一个,使用 in判断最右边的是否在目前的串里面,max_len记录最大的

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------

T4 寻找两个有序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0
示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        nums3=nums1+nums2
        nums3.sort()
        lens=len(nums3)
        if lens % 2 == 0:
            res=(nums3[lens//2]+nums3[(lens//2)-1])/2
        else:
            res=nums3[lens//2]
        return res
        
        

思路:第三个数组放置1,2,后排序,偶数就是中间的平均数,奇数就是中间的一个使用//整除,做的比较偷鸡

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

T5  最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

class Solution:
    def longestPalindrome(self, s: str) -> str:
        lens=len(s)
        #try dp
        if lens <= 1:
            return s
        dp=[[False for i in range(lens)] for i in range(lens)]#造dp[l][r]并且都置为false
        res=s[0]
        max_len=1
        for r in range(1,lens):
            for l in range(r):
                if s[r]==s[l] and (r-l<=2 or dp[l+1][r-1]):#状态转移方程(1.左右边界相等 2.上一个即左右各减一是回文,或者左右边界之间不成回文串即只有一个字符)
                    dp[l][r]=True
                    length=r-l+1
                    if length>max_len:
                        res=s[l:r+1]
                        max_len=length
        return res
                        
        
                

思路:1.马拉车,个人认为是强化版的中心扩展法

            2.动态规划,也是从这道题学到了动态规划的思路,即考虑目前符合标准的情况1.目前首尾相等2.左右各朝内一格是回文子串或者不为字符串,就是单个字符,即代码中r-l<=2,即这个式子s[r]==s[l] and (r-l<=2 or dp[l+1][r-1]),从回答区的大佬那学习到,感谢

你可能感兴趣的:(力扣,python,LeetCode,力扣,算法,动态规划)