【leetcode热题100】刷题记录(5-8)

  • 5. 最长回文子串
  • 2. 两数相加
  • 3. 无重复字符的最长子串
  • 4. 寻找两个正序数组的中位数

5. 最长回文子串

题目链接

给你一个字符串 s,找到 s最长的回文子串

题目解答

思路就是动态规划。
状态定义:dp[i][j]表示字符串从ij的字符串是否是回文串
状态转移:
s[i] == s[j] 分两种,一种长度小于等于3, dp[i][j]==True;其他情况则dp[i][j] = dp[i+1][j-1];

s[i] != s[j]dp[i][j] = False;

python 解答

class Solution:def longestPalindrome(self, s: str) -> str:n = len(s)# 初始化dp数组dp = [[False]*(n) for _ in range(n)]# 边界条件 单个字符是属于回文字符串的for i in range(n): dp[i][i] = True# 定义一下最长长度和初始位置maxlen, idx = 1, 0# 按照长度来遍历for lens in range(2, n + 1):for st in range(0, n - lens + 1):end = st + lens - 1if s[st] == s[end]: # 字符相等的时候,看长度, 分两种情况if lens <= 3:dp[st][end] = Trueelse:dp[st][end] = dp[st+1][end-1]else: # 字符不相等的时候,必然不是dp[st][end] = False# 更新一下最优状态if dp[st][end] and lens > maxlen:maxlen = lensidx = streturn s[idx:idx+maxlen]

cpp解答

class Solution {public:string longestPalindrome(string s) {int n = s.size();if (n < 2) {return s;}int maxLen = 1;int begin = 0;vector<vector<bool>> dp(n, vector<bool>(n));for (int i = 0; i < n; i ++) dp[i][i] = true;for (int l = 2; l <= n; l ++){for (int i = 0; i < n; i ++){int j = i + l - 1;if (j >= n) break;if (s[i] == s[j]){if (l <= 3) dp[i][j] = true;else dp[i][j] = dp[i+1][j-1];}else{dp[i][j] = false;}// 更新最优状态if (dp[i][j] && l > maxLen){maxLen = l;begin = i;}}}return s.substr(begin, maxLen);}
};

2. 两数相加

题目链接

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

题目解答

直接模拟就可以了,注意c++用的时候,返回对象是个指针还是一个对象,指针的话,要用->,对象用.

python 解答

class Solution(object):def addTwoNumbers(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""adds = 0 # 进位head = curr = ListNode(0)while l1 or l2 or adds:val = 0if l1: val += l1.vall1 = l1.nextif l2: val += l2.vall2 = l2.nextval, adds = (val + adds) % 10, (val + adds) // 10 node = ListNode(val)curr.next = nodecurr = curr.nextreturn head.next

cpp解答

class Solution {public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {int adds = 0;ListNode *head = nullptr;ListNode *curr = nullptr;head = curr = new ListNode(0);while (l1 || l2 || adds){int val = 0;if(l1){val += l1->val;l1 = l1->next;}if(l2){val += l2->val;l2 = l2->next;}curr->next = new ListNode((val + adds) % 10);adds = (val + adds) / 10;curr = curr->next;}return head->next;}
};

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

题目链接

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

题目解答

双指针加set

从左往右滑窗,如果遇到set里面没有的元素,右指针一直右移动,直到不满足了,更新一下最长距离,然后加入s[r],删掉s[l],这里我还记录了final_l,相当于如果要求最长不重复子序列的话,那就直接输出s[final_l:final_l+res]

python 解答

class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""l, r = 0, 0final_l = 0res = 0dic = set()while r < len(s):while r < len(s) and s[r] not in dic:dic.add(s[r])r += 1if r - l > res:res = r - lfinal_l = ldic.remove(s[l])l += 1return res

cpp解答

class Solution {public:int lengthOfLongestSubstring(string s) {int l = 0, r = 0, res = 0, final_l;unordered_set<char> dic;while (r < s.size()){while (r < s.size() and dic.find(s[r]) == dic.end()){dic.insert(s[r]);r ++;}if (r - l > res){res = r - l;final_l = l;}dic.erase(s[l]);l ++;}return res;}
};

4. 寻找两个正序数组的中位数

题目链接

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数

算法的时间复杂度应该为 O(log (m+n))

题目解答

二分查找

具体而言就是寻找到对两个数组的一个分割,转化成求前k小数字的问题,分割的时候主要使得分割线左右元素的值满足交叉有序关系,然后再讨论一些边界条件即可。具体的可以看官网解析

python 解答

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:if len(nums1) > len(nums2):return self.findMedianSortedArrays(nums2, nums1)infinty = 2**40m, n = len(nums1), len(nums2)left, right = 0, m# median1:前一部分的最大值# median2:后一部分的最小值median1, median2 = 0, 0while left <= right:# 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]# // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]i = (left + right) // 2j = (m + n + 1) // 2 - i# nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]nums_im1 = (-infinty if i == 0 else nums1[i - 1])nums_i = (infinty if i == m else nums1[i])nums_jm1 = (-infinty if j == 0 else nums2[j - 1])nums_j = (infinty if j == n else nums2[j])if nums_im1 <= nums_j:median1, median2 = max(nums_im1, nums_jm1), min(nums_i, nums_j)left = i + 1else:right = i - 1return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1

cpp解答

class Solution {public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {if (nums1.size() > nums2.size()) {return findMedianSortedArrays(nums2, nums1);}int m = nums1.size();int n = nums2.size();int left = 0, right = m;// median1:前一部分的最大值// median2:后一部分的最小值int median1 = 0, median2 = 0;while (left <= right) {// 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]// 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]int i = (left + right) / 2;int j = (m + n + 1) / 2 - i;// nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]int nums_im1 = (i == 0 ? INT_MIN : nums1[i - 1]);int nums_i = (i == m ? INT_MAX : nums1[i]);int nums_jm1 = (j == 0 ? INT_MIN : nums2[j - 1]);int nums_j = (j == n ? INT_MAX : nums2[j]);if (nums_im1 <= nums_j) {median1 = max(nums_im1, nums_jm1);median2 = min(nums_i, nums_j);left = i + 1;} else {right = i - 1;}}return (m + n) % 2 == 0 ? (median1 + median2) / 2.0 : median1;}
};

【leetcode热题100】刷题记录(5-8)相关推荐

  1. 【LeetCode 剑指offer刷题】数组题2:57 有序数组中和为s的两个数(167 Two Sum II - Input array is sorted)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 57 有序数组中和为s的两个数 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是 ...

  2. 【LeetCode 剑指offer刷题】回溯法与暴力枚举法题6:Number of Islands

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Number of Islands Given a 2d grid map of '1's (land) and ' ...

  3. leetcode剑指offe刷题-第一题-用两个栈实现队列

    leetcode剑指offe刷题-第一题 文章目录 leetcode剑指offe刷题-第一题 前言 一.用两个栈实现队列 1.思路 2.代码如下 总结 前言 记录一下自己刷算法的路程. leetcod ...

  4. 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 101. Symmetric Tree /**  * Definition for a binary tree no ...

  5. 【LeetCode 剑指offer刷题】字符串题6:67 把字符串转成整数

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 67 把字符串转成整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符 ...

  6. 【LeetCode 剑指offer刷题】树题16:Kth Smallest Element in a BST

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Kth Smallest Element in a BST Given a binary search tree, ...

  7. 【LeetCode 剑指offer刷题】查找与排序题14:Wiggle Sort(系列)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Wiggle Sort II Given an unsorted array nums, reorder it su ...

  8. 【LeetCode 剑指offer刷题】查找与排序题12:Top K Frequent Elements

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Top K Frequent Elements Given a non-empty array of integer ...

  9. 【LeetCode 剑指offer刷题】矩阵题1:4 有序矩阵中的查找( 74. Search a 2D Matrix )(系列)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 74. Search a 2D Matrix Write an efficient algorithm that s ...

  10. 【LeetCode 剑指offer刷题】树题19:8 二叉树中序遍历的下一个结点

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 8 二叉树中序遍历的下一个结点 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注 ...

最新文章

  1. VIM — vim-go
  2. Ubuntu下安装Python开发的Facebook Faiss相似性搜索工具
  3. Java序列化、反序列化
  4. java 客户化排序_第八部分_客户化JSP标签
  5. 自学python好找工作么-学完Python好找工作吗?为什么有人学完找不到工作?
  6. 微信小程序地图添加标记点
  7. CC攻击防御策略详解,效果显著
  8. linux pwm控制蜂鸣器 滴滴_linux pwm实现蜂鸣器
  9. 是时候关注邮件安全了
  10. android app 重启消失了,android平板重启apk消失不见
  11. 内外兼修:程序员的成长之路+软技能 代码之外的生存指南
  12. 广度优先搜索(BFS)最短路径输出表示(三种方法)
  13. 颜色大全:颜色名称和颜色值。色板、色板对照表1
  14. POI处理Excel中公式不能自动计算出来的问题
  15. 局域网内windows远程mac(使用TeamView)
  16. 陆源:阿贝尔对椭圆函数论的贡献[附椭圆函数、模形式(g_2,g_3)、模函数的C++程序计算]
  17. Oracle EBS中分类账和法人实体 的关系(有sql语句实例)
  18. java calendar 增加年_java 使用Date类、Calendar类,实现增加日期
  19. 盘点国内MCU级RISC-V内核IP厂商
  20. -webkit-border-radius和-moz-border-radius

热门文章

  1. [转]姐弟恋—条走不完的路!恳求意见!
  2. Python爬虫拓展应用:最新版本问卷星自动刷,包括解决智能验证、滑块等问题
  3. 微信支付分693是属于什么水平?
  4. 两化融合贯标补贴!湖北省13市两化融合贯标补贴补助及申请条件、流程汇编大全
  5. 教学用计算机报废年限,山东英才学院教学科研仪器设备报废管理规定(试行)...
  6. javascript表格操作的快捷方法
  7. 【一笔画益智游戏教程攻略】总共有100关图文教程
  8. 分支限界法—任务分配问题
  9. 尾插法建立单链表(详细版)
  10. 凛冬已至,望各位早日背上行囊出发