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

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

示例2

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

示例3

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

提示:

1. S.length <= 10000

2. S[i] 为 "(" 或 ")"

3. S 是一个有效括号字符串

  1. class Solution:
  2. def removeOuterParentheses(self, S):
  3. '''
  4. type: S:str
  5. rtype:str
  6. '''
  7. a = 0
  8. b = 0
  9. s = ""
  10. for i in range(len(S)):
  11. if S[i] == '(':
  12. a += 1
  13. else:
  14. b += 1
  15. if a == b:
  16. s = s + S[i-2*(a-1):i]
  17. a = 0
  18. b = 0
  19. return s
  20. if __name__ =='__main__':
  21. S1 = '(()())(())'
  22. S2 = '(()())(())(()(()))'
  23. S3 = '()()'
  24. solution = Solution()
  25. s1 = solution.removeOuterParentheses(S1)
  26. s2 = solution.removeOuterParentheses(S2)
  27. s3 = solution.removeOuterParentheses(S3)
  28. print(f'"{s1}"')
  29. print(f'"{s2}"')
  30. print(f'"{s3}"')
  1. "()()()"
  2. "()()()()(())"
  3. ""

2. 两数之和

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

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

示例:

  1. 给定 nums = [2, 7, 11, 15], target = 9
  2. 因为 nums[0] + nums[1] = 2 + 7 = 9
  3. 所以返回 [0, 1]
  1. class Solution:
  2. def twoSum(self, nums, target):
  3. '''
  4. type: nums:List[int]
  5. type: target:int
  6. rtype: list
  7. '''
  8. for i in nums:
  9. lis = nums[nums.index(i)+1:]
  10. if (target - i) in lis:
  11. return [nums.index(i),lis.index(target - i)+nums.index(i)+1]
  12. break
  13. if __name__ =='__main__':
  14. nums = [2, 7, 11, 15]
  15. target = 9
  16. solution = Solution()
  17. s = solution.twoSum(nums,target)
  18. print(s)
  1. [0, 1]

3. 宝石与石头

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

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

示例1

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

示例2

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

提示

  • S 和 J 最多含有50个字母。
  • J 中的字符不重复。
  1. class Solution:
  2. def numJewelsInStones(self, J, S):
  3. '''
  4. type: J:str
  5. type: S:str
  6. rtype:int
  7. '''
  8. s = 0
  9. for i in range(len(J)):
  10. s += S.count(J[i])
  11. return s
  12. if __name__ =='__main__':
  13. J1 = "aA"
  14. S1 = "aAAbbbb"
  15. J2 = "z"
  16. S2 = "ZZ"
  17. solution = Solution()
  18. s1 = solution.numJewelsInStones(J1,S1)
  19. s2 = solution.numJewelsInStones(J2,S2)
  20. print(f'{s1}\n{s2}')
  1. 3
  2. 0

4. 移除元素

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

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

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

示例1

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

示例2

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

说明

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

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

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

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

    int len = removeElement(nums, val);

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

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

    1. print(nums[i]); }
  1. class Solution:
  2. def removeElement(self, nums, val):
  3. '''
  4. type: nums: List[int]
  5. type: val:int
  6. rtype: int
  7. '''
  8. for i in range(nums.count(val)):
  9. nums.remove(val)
  10. return len(nums)
  11. if __name__ =='__main__':
  12. nums1 = [3,2,2,3]
  13. val1 = 3
  14. nums2 = [0,1,2,2,3,0,4,2]
  15. val2 = 2
  16. solution = Solution()
  17. s1 = solution.removeElement(nums1,val1)
  18. s2 = solution.removeElement(nums2,val2)
  19. print(f'{s1} {nums1[:s1]}')
  20. print(f'{s2} {nums2[:s2]}')
  1. 2 [2, 2]
  2. 5 [0, 1, 3, 0, 4]

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

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

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

示例1

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

示例2

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

说明

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

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

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

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

      int len = removeDuplicates(nums);

    2. 在函数里修改输入数组对于调用者是可见的。

    3. 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

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

    1. print(nums[i]);

    }

  1. class Solution:
  2. def removeDuplicates(self, nums):
  3. '''
  4. type: nums:List[int]
  5. rtype:int
  6. '''
  7. a = 0
  8. for i in range(len(nums)):
  9. if nums[i] not in nums[:a]:
  10. nums[a] = nums[i]
  11. a += 1
  12. return a
  13. if __name__ =='__main__':
  14. nums1 = [1,1,2]
  15. nums2 = [0,0,1,1,1,2,2,3,3,4]
  16. solution = Solution()
  17. s1 = solution.removeDuplicates(nums1)
  18. s2 = solution.removeDuplicates(nums2)
  19. print(f'{s1} {nums1[:s1]}')
  20. print(f'{s2} {nums2[:s2]}')
  1. 2 [1, 2]
  2. 5 [0, 1, 2, 3, 4]

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

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

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

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

示例 1:

  1. nums1 = [1, 3]
  2. nums2 = [2]
  3. 则中位数是 2.0

示例 2:

  1. nums1 = [1, 2]
  2. nums2 = [3, 4]
  3. 则中位数是 (2 + 3)/2 = 2.5
  1. class Solution:
  2. def findMedianSortedArrays(self, nums1, nums2):
  3. '''
  4. type:nums1: List[int]
  5. type:nums2: List[int]
  6. rtype:float
  7. '''
  8. nums1.extend(nums2)
  9. nums1.sort()
  10. length_nums1 = len(nums1)
  11. if length_nums1 % 2 != 0:
  12. i = length_nums1 // 2
  13. return float(nums1[i])
  14. else:
  15. i = length_nums1 // 2
  16. return float((nums1[i]+nums1[i-1])/2)
  17. if __name__ =='__main__':
  18. nums11 = [1, 3]
  19. nums12 = [2]
  20. nums21 = [1, 2]
  21. nums22 = [3, 4]
  22. solution = Solution()
  23. s1 = solution.findMedianSortedArrays(nums11,nums12)
  24. s2 = solution.findMedianSortedArrays(nums21,nums22)
  25. print(s1)
  26. print(s2)
  1. 2.0
  2. 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. 输入: [1,8,6,2,5,4,8,3,7]
  2. 输出: 49
  1. class Solution:
  2. def maxArea(self, height):
  3. '''
  4. type height:List[int]
  5. rtype:int
  6. '''
  7. area_max = 0
  8. i = 0
  9. j = len(height)-1
  10. while i < j:
  11. if height[i] > height[j]:
  12. area_max = max(area_max,height[j]*(j-i))
  13. j -= 1
  14. else:
  15. area_max = max(area_max,height[i]*(j-i))
  16. i += 1
  17. return area_max
  18. if __name__ =='__main__':
  19. nums = [1,8,6,2,5,4,8,3,7]
  20. solution = Solution()
  21. s1 = solution.maxArea(nums)
  22. print(s1)
  1. 49

8.存在重复元素

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

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

示例1

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

示例2

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

示例3

  1. 输入: [1,1,1,3,3,4,3,2,4,2]
  2. 输出: true
  1. class Solution:
  2. def containsDuplicate(self, nums):
  3. '''
  4. type: nums: List[int]
  5. rtype: bool
  6. '''
  7. nums_set = set(nums)
  8. if len(nums) != len(nums_set):
  9. return bool(1)
  10. else:
  11. return bool(0)
  12. if __name__ =='__main__':
  13. nums1 = [1,2,3,1]
  14. nums2 = [1,2,3,4]
  15. nums3 = [1,1,1,3,3,4,3,2,4,2]
  16. solution = Solution()
  17. s1 = solution.containsDuplicate(nums1)
  18. s2 = solution.containsDuplicate(nums2)
  19. s3 = solution.containsDuplicate(nums3)
  20. print(f'{s1}\n{s2}\n{s3}')
  1. True
  2. False
  3. True

Leetcode题目practice的更多相关文章

  1. leetcode题目清单

    2016-09-24,开始刷leetcode上的算法题,下面整理一下leetcode题目清单.Github-leetcode 1.基本数学 Two Sum Palindrome Number Cont ...

  2. LeetCode 题目总结/分类

    LeetCode 题目总结/分类 利用堆栈: http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ http://oj.l ...

  3. Binary Search Tree 以及一道 LeetCode 题目

    一道LeetCode题目 今天刷一道LeetCode的题目,要求是这样的: Given a binary search tree and the lowest and highest boundari ...

  4. LeetCode题目解答

    LeetCode题目解答——Easy部分 Posted on 2014 年 11 月 3 日 by 四火 [Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复 ...

  5. LeetCode题目总结-滑窗法

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

  6. LeetCode题目答案及理解汇总(持续更新)

    面试算法题 dfs相关 全排列 #include<bits/stdc++.h> using namespace std; const int N = 10; //用一个path数组来存储每 ...

  7. LeetCode题目_Reverse Integer

    最近在LeetCode上做题,写点东西记录一下,虽然自己做的都是些很水的题目,但是重在练手. 题号7:Reverse Integer,题目描述: Reverse digits of an intege ...

  8. 拓扑排序(附LeetCode题目)

    算法期中考到一题关于拓扑序的题目,觉得很值得一写. 1.什么是拓扑序? 对一个有向无环图进行拓扑排序,假如图中存在一条从顶点A到顶点B的路径,则拓扑序中顶点A出现在顶点B的前面.要注意的是,这是对有向 ...

  9. Leetcode题目分类整理

    一.数组 8) 双指针 ---- 滑动窗口 例题: 3. Longest Substring Without Repeating Characters 描述:Given a string, find ...

随机推荐

  1. 【Beijing 2010】 次小生成树

    [题目链接] 点击打开链接 [算法] 首先,有一个结论 : 一定有一棵严格次小生成树是在最小生成树的基础上去掉一条边,再加上一条边 这个结论的正确性是显然的 我们先用kruskal算法求出最小生成树, ...

  2. 前端性能调优Gzip Filter

    转自:https://blog.csdn.net/zxk15982106569/article/details/18922613 客户端向web服务器端发出了请求后,通常情况下服务器端会将页面文件和其 ...

  3. Linux查找和替换目录下所有文件中字符串(转载)

    转自:http://rubyer.me/blog/1613/ 单个文件中查找替换很简单,就不说了.文件夹下所有文件中字符串的查找替换就要记忆了,最近部署几十台linux服务器,记录下总结. 查找文件夹 ...

  4. Hadoop回收站及fs.trash参数详解

    前言: Linux系统里,个人觉得最大的不方便之一就是没有回收站的概念.rm -rf很容易造成极大的损失.而在Hadoop或者说HDFS里面,有trash(回收站)的概念,可以使得数据被误删以后,还可 ...

  5. linux编译安装gcc5.3.0

    1.下载GCC5.3.0安装包 #su #cd /opt #wget http://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz 2.解压 #.tar. ...

  6. Jsp四个作用域page、request、session和application的区别

    1.简单说 page指当前页面.在一个jsp页面里有效  2.request 指从http请求到服务器处理结束,返回响应的整个过程.在这个过程中使用forward方式跳转多个jsp.在这些页面里你都可 ...

  7. System.AppDomain类详解(二)

    进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppD ...

  8. 用Martini、websocket实现单机版聊天室

    ChatRoom A stand-alone ChatRoom in Martini Please Star https://github.com/renleimlj/ChatRoom Interfa ...

  9. CF 334 div.2-D Moodular Arithmetic

    思路: 易知k = 0的时候答案是pp-1,k = 1的时候答案是pp. 当k >= 2的时候,f(0) = 0,对于 1 <= n <= p - 1,如果f(n)确定,由题意可知f ...

  10. WordPress个性页面制作教程

    写在前面的话: 有很多WordPress小伙伴想制作不同风格的页面来满足自己的个性需求 但是大多数模板提供的页面模板非常有限,该如何手动制作属于自己风格的模板页呢? 其实,正如以上所说的,每个人都想拥 ...