目录

  • Leetcode题目解答

    • 1. 删除最外层的括号
    • 2. 两数之和
    • 3. 宝石与石头
    • 4. 移除元素
    • 5.删除排序数组中的重复项
    • 6.寻找两个有序数组的中位数
    • 7.盛最多水的容器
    • 8.存在重复元素

Leetcode题目解答

1. 删除最外层的括号

有效括号字符串为空("")、"(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。

如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。

给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。

对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S

示例1

输入:"(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。

示例2

输入:"(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。

示例3

输入:"()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。

提示:
1. S.length <= 10000
2. S[i] 为 "(" 或 ")"
3. S 是一个有效括号字符串

class Solution:def removeOuterParentheses(self, S):'''type: S:strrtype:str'''a = 0b = 0s = ""for i in range(len(S)):if S[i] == '(':a += 1else:b += 1if a == b:s = s + S[i-2*(a-1):i]a = 0b = 0return s
if __name__ =='__main__':S1 = '(()())(())'S2 = '(()())(())(()(()))'S3 = '()()'solution = Solution()s1 = solution.removeOuterParentheses(S1)s2 = solution.removeOuterParentheses(S2)s3 = solution.removeOuterParentheses(S3)print(f'"{s1}"')print(f'"{s2}"')print(f'"{s3}"')
"()()()"
"()()()()(())"
""

2. 两数之和

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

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

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution:def twoSum(self, nums, target):'''type: nums:List[int]type: target:intrtype: list'''for i in nums:lis = nums[nums.index(i)+1:]if (target - i) in lis:return [nums.index(i),lis.index(target - i)+nums.index(i)+1]break
if __name__ =='__main__':nums = [2, 7, 11, 15]target = 9solution = Solution()s = solution.twoSum(nums,target)print(s)
[0, 1]

3. 宝石与石头

给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。

示例1

输入: J = "aA", S = "aAAbbbb"
输出: 3

示例2

输入: J = "z", S = "ZZ"
输出: 0

提示

  • S 和 J 最多含有50个字母。
  • J 中的字符不重复。
class Solution:def numJewelsInStones(self, J, S):'''type: J:strtype: S:strrtype:int'''s = 0for i in range(len(J)):s += S.count(J[i])return s
if __name__ =='__main__':J1 = "aA"S1 = "aAAbbbb"J2 = "z"S2 = "ZZ"solution = Solution()s1 = solution.numJewelsInStones(J1,S1)s2 = solution.numJewelsInStones(J2,S2)print(f'{s1}\n{s2}')
3
0

4. 移除元素

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例1

给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。

示例2

给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。

说明

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

  • 你可以想象内部操作如下:

    1. nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝

    int len = removeElement(nums, val);

    1. 在函数里修改输入数组对于调用者是可见的。
    2. 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

    for (int i = 0; i < len; i++) {

      print(nums[i]);  }
class Solution:def removeElement(self, nums, val):'''type: nums: List[int]type: val:intrtype: int'''for i in range(nums.count(val)):nums.remove(val)return len(nums)
if __name__ =='__main__':nums1 = [3,2,2,3]val1 = 3nums2 = [0,1,2,2,3,0,4,2]val2 = 2solution = Solution()s1 = solution.removeElement(nums1,val1)s2 = solution.removeElement(nums2,val2)print(f'{s1}  {nums1[:s1]}')print(f'{s2}  {nums2[:s2]}')
2  [2, 2]
5  [0, 1, 3, 0, 4]

5.删除排序数组中的重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例1

给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。

示例2

给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。

说明

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

  • 你可以想象内部操作如下:

    1. nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝

      int len = removeDuplicates(nums);

    2. 在函数里修改输入数组对于调用者是可见的。
    3. 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

    for (int i = 0; i < len; i++) {

      print(nums[i]);

    }

class Solution:def removeDuplicates(self, nums):'''type: nums:List[int]rtype:int'''a = 0for i in range(len(nums)):if nums[i] not in nums[:a]:nums[a] = nums[i]a += 1return a
if __name__ =='__main__':nums1 = [1,1,2]nums2 = [0,0,1,1,1,2,2,3,3,4]solution = Solution()s1 = solution.removeDuplicates(nums1)s2 = solution.removeDuplicates(nums2)print(f'{s1}  {nums1[:s1]}')print(f'{s2}  {nums2[:s2]}')
2  [1, 2]
5  [0, 1, 2, 3, 4]

6.寻找两个有序数组的中位数

给定两个大小为 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
class Solution:def findMedianSortedArrays(self, nums1, nums2):'''type:nums1: List[int]type:nums2: List[int]rtype:float'''nums1.extend(nums2)nums1.sort()length_nums1 = len(nums1)if length_nums1 % 2 != 0:i = length_nums1 // 2return float(nums1[i])else:i = length_nums1 // 2return float((nums1[i]+nums1[i-1])/2)
if __name__ =='__main__':nums11 = [1, 3]nums12 = [2]nums21 = [1, 2]nums22 = [3, 4]solution = Solution()s1 = solution.findMedianSortedArrays(nums11,nums12)s2 = solution.findMedianSortedArrays(nums21,nums22)print(s1)print(s2)
2.0
2.5

7.盛最多水的容器

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。


图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

输入: [1,8,6,2,5,4,8,3,7]
输出: 49
class Solution:def maxArea(self, height):'''type height:List[int]rtype:int'''area_max = 0i = 0j = len(height)-1  while i < j:if height[i] > height[j]:area_max = max(area_max,height[j]*(j-i))j -= 1else:area_max = max(area_max,height[i]*(j-i))i += 1return area_max
if __name__ =='__main__':nums = [1,8,6,2,5,4,8,3,7]solution = Solution()s1 = solution.maxArea(nums)print(s1)
49

8.存在重复元素

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例1

输入: [1,2,3,1]
输出: true

示例2

输入: [1,2,3,4]
输出: false

示例3

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
class Solution:def containsDuplicate(self, nums):'''type: nums: List[int]rtype: bool'''nums_set = set(nums)if len(nums) != len(nums_set):return bool(1)else:return bool(0)
if __name__ =='__main__':nums1 = [1,2,3,1]nums2 = [1,2,3,4]nums3 = [1,1,1,3,3,4,3,2,4,2]solution = Solution()s1 = solution.containsDuplicate(nums1)s2 = solution.containsDuplicate(nums2)s3 = solution.containsDuplicate(nums3)print(f'{s1}\n{s2}\n{s3}')      
True
False
True

转载于:https://www.cnblogs.com/Hades123/p/10851387.html

Leetcode题目practice相关推荐

  1. Acwing LeetCode 题目分类——配套基础课进阶课

    LeetCode 题目分类--配套基础课进阶课 1.基础 二分(满足一个条件的最值问题) LeetCode33 https://leetcode.com/problems/search-in-rota ...

  2. ​“手把手撕LeetCode题目,扒各种算法套路的裤子”

    出品 | AI科技大本营(ID:rgznai100) 刷LeetCode刷到懵还是一头雾水? 莫慌,这里有一个标星27000+的算法详解教程. 从项目命名来看,作者labuladong就有着要干翻算法 ...

  3. python检索地址_35.leetcode题目讲解(Python): 搜索插入位置

    题目如下: image.png 这道题使用双指针折半查找比较容易解,指的注意的是,如果出现插入元素与输入数组里的元素相同,需要插入到相同元素的位置,比如: [8,5,3],5 应该返回1,而不是2. ...

  4. Github标星59.7k:用动画的形式呈现解LeetCode题目的思路

    前些日子推荐了一个仓库,把常见算法用python语言实现了(见文章),近日在github上发现另外一个59700多star的仓库,用动画的形式呈现解LeetCode题目的思路,非常值得推荐. 仓库说明 ...

  5. 推荐:用动画的形式呈现解LeetCode题目的思路(github上25000多star)

    前些日子推荐了一个仓库,把常见算法用python语言实现了(见文章),近日在github上发现另外一个25000多star的仓库,用动画的形式呈现解LeetCode题目的思路,非常值得推荐. 仓库说明 ...

  6. 二叉树笔记(深度遍历与广度遍历+13道leetcode题目(深度3道、广度10道))

    本文章为结合leetcode题目以及公众号"代码随想录"的文章所做的笔记! 感觉代码随想录的题目整理真的很好,比自己盲目刷题好很多. 目录 1.二叉树小记 1.满二叉树与完全二叉树 ...

  7. python旋转排序数组_33.leetcode题目讲解(Python):搜索旋转排序数组

    题目如下: 题目 这道题比较简单,不做过多解释了,注意程序终止条件,参考代码如下: class Solution: def search(self, nums, target): "&quo ...

  8. LeetCode题目总结-滑窗法

    LeetCode题目总结-滑动窗口法 滑动窗口法:此方法首先建立一个长度为零的窗口,把右侧窗口向右移动,当新的元素与原来窗口中的元素不重复时,把新的元素加入其中,并更新窗口长度:当新的元素与原集合中的 ...

  9. “手把手撕LeetCode题目,扒各种算法套路的裤子”

    来源 | AI科技大本营(ID:rgznai100) 刷LeetCode刷到懵还是一头雾水? 莫慌,这里有一个标星27000+的算法详解教程. 从项目命名来看,作者labuladong就有着要干翻算法 ...

  10. Leetcode题目分类指南(单独刷题或学习算法书籍配合使用)

    Leetcode题目分类指南 笔者在学习<算法导论>同时,希望能够配合Leetcode的题目进行分类模块化练习,该分类为笔者自己根据做题学习经验,结合<算法导论>的内容,给出L ...

最新文章

  1. GitLab 8.7发布
  2. 硅谷精英的薪水大揭秘,你和他们差距有多大?
  3. 如何设置Winform控件的ClientRectangle
  4. 【面试招聘】聊聊读研究生应该怎么权衡offer的选择:适合选择恐惧症
  5. 手写ORM入门篇(一)
  6. mysql子查询是什么_mysql子查询
  7. 关于hive数仓这个概念的一些理解+查看hive底层引擎是否是tez
  8. Hadoop问题:The auxService:mapreduce_shuffle does not exist
  9. O(1), O(n), O(logn), O(nlogn) 的区别(转自ted 常)
  10. 设置共享文件夹,samba和chmod到底谁的权限大
  11. 关于字符串匹配算法研究
  12. 别说你不知IE9正式版浏览器小技巧9则
  13. vb改动microsip让microsip隐藏然后命令拨打电话
  14. 为什么SICP要讨论那么多的初等数学
  15. 侦听器watch及其和计算属性、methods方法的总结
  16. python 导入自己写的类
  17. laravel中外部定义whereIn的用法和where中使用in
  18. 银行理财子公司蓄力布局A股;现金管理类理财产品整改加速
  19. opencv录制视频 python_Python-OpenCV录制H264编码的MP4视频
  20. MySQL数据库基础01 韩顺平 自学笔记

热门文章

  1. LINUX使用OpenSSL进行签名
  2. MAC编译库的路径问题rpath/install_name
  3. 别人统一四大力学,吾统一四大布局方向
  4. 培训变成了闹剧,却不想怎么改进
  5. You must install libks to build mod_signalwire
  6. 软件基本功:linux/windows的头文件互相包含,大哥你这是什么创新?
  7. 在龙芯平台上编译jogamp(jogl)
  8. FireFox 64位不支持NPAPI插件,不论是32位还是64位
  9. 通过手机号码编码传送信息的想法
  10. 建议让游客参与修长城