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]),从回答区的大佬那学习到,感谢