Skip to content

Commit 579ed13

Browse files
author
liningrui
committed
add new solution
1 parent bf49772 commit 579ed13

8 files changed

+470
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。
2+
#
3+
#
4+
#
5+
# 示例 1:
6+
#
7+
#
8+
# 输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
9+
# 输出:6
10+
# 解释:[1,1,1,0,0,1,1,1,1,1,1]
11+
# 粗体数字从 0 翻转到 1,最长的子数组长度为 6。
12+
#
13+
# 示例 2:
14+
#
15+
#
16+
# 输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
17+
# 输出:10
18+
# 解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
19+
# 粗体数字从 0 翻转到 1,最长的子数组长度为 10。
20+
#
21+
#
22+
#
23+
# 提示:
24+
#
25+
#
26+
# 1 <= nums.length <= 10⁵
27+
# nums[i] 不是 0 就是 1
28+
# 0 <= k <= nums.length
29+
#
30+
# Related Topics 数组 二分查找 前缀和 滑动窗口 👍 441 👎 0
31+
32+
33+
# leetcode submit region begin(Prohibit modification and deletion)
34+
class Solution:
35+
def longestOnes(self, nums: List[int], k: int) -> int:
36+
counter = 0
37+
maxl = 0
38+
left = 0
39+
for i,n in enumerate(nums):
40+
if n==0:
41+
counter+=1
42+
while counter>k and left<=i:
43+
if nums[left]==0:
44+
counter-=1
45+
left+=1
46+
maxl = max(maxl, i-left+1)
47+
return maxl
48+
# leetcode submit region end(Prohibit modification and deletion)

script/[264]丑数 II.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# 给你一个整数 n ,请你找出并返回第 n 个 丑数 。
2+
#
3+
# 丑数 就是只包含质因数 2、3 和/或 5 的正整数。
4+
#
5+
#
6+
#
7+
# 示例 1:
8+
#
9+
#
10+
# 输入:n = 10
11+
# 输出:12
12+
# 解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
13+
#
14+
#
15+
# 示例 2:
16+
#
17+
#
18+
# 输入:n = 1
19+
# 输出:1
20+
# 解释:1 通常被视为丑数。
21+
#
22+
#
23+
#
24+
#
25+
# 提示:
26+
#
27+
#
28+
# 1 <= n <= 1690
29+
#
30+
# Related Topics 哈希表 数学 动态规划 堆(优先队列) 👍 937 👎 0
31+
32+
33+
# leetcode submit region begin(Prohibit modification and deletion)
34+
class Solution:
35+
def nthUglyNumber(self, n: int) -> int:
36+
dp = [1] * n
37+
index2, index3, index5 = 0,0,0
38+
for i in range(1, n):
39+
val = min(dp[index2] *2, dp[index3] * 3 , dp[index5]*5)
40+
dp[i] = val
41+
# 注意这里不是if/else的关系, 以6为例要同时移动index2和index3
42+
if val == dp[index2]*2:
43+
index2+=1
44+
if val ==dp[index3]*3:
45+
index3+=1
46+
if val ==dp[index5]*5:
47+
index5+=1
48+
return dp[-1]
49+
50+
# leetcode submit region end(Prohibit modification and deletion)

script/[31]下一个排列.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
2+
#
3+
#
4+
# 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
5+
#
6+
#
7+
# 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就
8+
# 是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
9+
#
10+
#
11+
# 例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
12+
# 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
13+
# 而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
14+
#
15+
#
16+
# 给你一个整数数组 nums ,找出 nums 的下一个排列。
17+
#
18+
# 必须 原地 修改,只允许使用额外常数空间。
19+
#
20+
#
21+
#
22+
# 示例 1:
23+
#
24+
#
25+
# 输入:nums = [1,2,3]
26+
# 输出:[1,3,2]
27+
#
28+
#
29+
# 示例 2:
30+
#
31+
#
32+
# 输入:nums = [3,2,1]
33+
# 输出:[1,2,3]
34+
#
35+
#
36+
# 示例 3:
37+
#
38+
#
39+
# 输入:nums = [1,1,5]
40+
# 输出:[1,5,1]
41+
#
42+
#
43+
#
44+
#
45+
# 提示:
46+
#
47+
#
48+
# 1 <= nums.length <= 100
49+
# 0 <= nums[i] <= 100
50+
#
51+
# Related Topics 数组 双指针 👍 1822 👎 0
52+
53+
54+
# leetcode submit region begin(Prohibit modification and deletion)
55+
class Solution:
56+
def nextPermutation(self, nums: List[int]) -> None:
57+
"""
58+
Do not return anything, modify nums in-place instead.
59+
"""
60+
#第一个升序
61+
l = len(nums)
62+
pos = None
63+
for i in range(l-1,0,-1):
64+
if nums[i]>nums[i-1]:
65+
pos = i-1
66+
break
67+
if pos is None:
68+
nums[:] = nums[::-1]
69+
return
70+
#后半部分都是降序所以从后向前搜索
71+
for i in range(l-1, pos,-1):
72+
if nums[i]> nums[pos]:
73+
nums[i], nums[pos] = nums[pos], nums[i]
74+
break
75+
76+
nums[(pos+1):] = nums[(pos+1):][::-1]
77+
78+
# leetcode submit region end(Prohibit modification and deletion)

script/[647]回文子串.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
2+
#
3+
# 回文字符串 是正着读和倒过来读一样的字符串。
4+
#
5+
# 子字符串 是字符串中的由连续字符组成的一个序列。
6+
#
7+
# 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
8+
#
9+
#
10+
#
11+
# 示例 1:
12+
#
13+
#
14+
# 输入:s = "abc"
15+
# 输出:3
16+
# 解释:三个回文子串: "a", "b", "c"
17+
#
18+
#
19+
# 示例 2:
20+
#
21+
#
22+
# 输入:s = "aaa"
23+
# 输出:6
24+
# 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
25+
#
26+
#
27+
#
28+
# 提示:
29+
#
30+
#
31+
# 1 <= s.length <= 1000
32+
# s 由小写英文字母组成
33+
#
34+
# Related Topics 字符串 动态规划 👍 928 👎 0
35+
36+
37+
# leetcode submit region begin(Prohibit modification and deletion)
38+
class Solution:
39+
def countSubstrings(self, s: str) -> int:
40+
l = len(s)
41+
def valid_count(pt1,pt2):
42+
counter =0
43+
while pt1>=0 and pt2<l and s[pt1]==s[pt2]:
44+
pt1-=1
45+
pt2+=1
46+
counter+=1
47+
return counter
48+
counter =0
49+
for i in range(l):
50+
counter += valid_count(i,i)
51+
if i>0:
52+
counter+= valid_count(i-1,i)
53+
return counter
54+
55+
56+
57+
# leetcode submit region end(Prohibit modification and deletion)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# 给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
2+
#
3+
#
4+
# 示例 1:
5+
#
6+
#
7+
# 输入:nums = [10,5,2,6], k = 100
8+
# 输出:8
9+
# 解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。
10+
# 需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。
11+
#
12+
#
13+
# 示例 2:
14+
#
15+
#
16+
# 输入:nums = [1,2,3], k = 0
17+
# 输出:0
18+
#
19+
#
20+
#
21+
# 提示:
22+
#
23+
#
24+
# 1 <= nums.length <= 3 * 10⁴
25+
# 1 <= nums[i] <= 1000
26+
# 0 <= k <= 10⁶
27+
#
28+
# Related Topics 数组 滑动窗口 👍 574 👎 0
29+
30+
31+
# leetcode submit region begin(Prohibit modification and deletion)
32+
class Solution:
33+
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
34+
prod =1
35+
left =0
36+
counter = 0
37+
l = len(nums)
38+
for i,n in enumerate(nums):
39+
prod *=n
40+
while prod >= k and left<=i:
41+
prod/=nums[left]
42+
left+=1
43+
counter += (i-left+1)
44+
return counter
45+
46+
# leetcode submit region end(Prohibit modification and deletion)

script/[75]颜色分类.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
2+
#
3+
# 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
4+
#
5+
#
6+
#
7+
#
8+
# 必须在不使用库的sort函数的情况下解决这个问题。
9+
#
10+
#
11+
#
12+
# 示例 1:
13+
#
14+
#
15+
# 输入:nums = [2,0,2,1,1,0]
16+
# 输出:[0,0,1,1,2,2]
17+
#
18+
#
19+
# 示例 2:
20+
#
21+
#
22+
# 输入:nums = [2,0,1]
23+
# 输出:[0,1,2]
24+
#
25+
#
26+
#
27+
#
28+
# 提示:
29+
#
30+
#
31+
# n == nums.length
32+
# 1 <= n <= 300
33+
# nums[i] 为 0、1 或 2
34+
#
35+
#
36+
#
37+
#
38+
# 进阶:
39+
#
40+
#
41+
# 你可以不使用代码库中的排序函数来解决这道题吗?
42+
# 你能想出一个仅使用常数空间的一趟扫描算法吗?
43+
#
44+
# Related Topics 数组 双指针 排序 👍 1341 👎 0
45+
46+
47+
# leetcode submit region begin(Prohibit modification and deletion)
48+
class Solution:
49+
def sortColors(self, nums: List[int]) -> None:
50+
"""
51+
Do not return anything, modify nums in-place instead.
52+
"""
53+
pt0 = 0
54+
pt1 = 0
55+
for i,n in enumerate(nums):
56+
if n==1:
57+
nums[pt1], nums[i] = nums[i],nums[pt1]
58+
pt1+=1
59+
elif n==0:
60+
nums[pt0], nums[i] = nums[i],nums[pt0]
61+
pt0+=1
62+
#核心就是这个部分当ptr比1的ptr更高的时候,把被误换出去的1给重新换回来
63+
if i> pt1:
64+
nums[pt1],nums[i] = nums[i],nums[pt1]
65+
pt1+=1
66+
return nums
67+
68+
69+
70+
# leetcode submit region end(Prohibit modification and deletion)

script/[763]划分字母区间.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
2+
#
3+
#
4+
#
5+
# 示例:
6+
#
7+
#
8+
# 输入:S = "ababcbacadefegdehijhklij"
9+
# 输出:[9,7,8]
10+
# 解释:
11+
# 划分结果为 "ababcbaca", "defegde", "hijhklij"。
12+
# 每个字母最多出现在一个片段中。
13+
# 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
14+
#
15+
#
16+
#
17+
#
18+
# 提示:
19+
#
20+
#
21+
# S的长度在[1, 500]之间。
22+
# S只包含小写字母 'a' 到 'z' 。
23+
#
24+
# Related Topics 贪心 哈希表 双指针 字符串 👍 769 👎 0
25+
26+
27+
# leetcode submit region begin(Prohibit modification and deletion)
28+
class Solution:
29+
def partitionLabels(self, s: str) -> List[int]:
30+
pos = dict()
31+
for i,n in enumerate(s):
32+
pos[n] = i
33+
34+
result = []
35+
left = 0
36+
right = 0
37+
for i,n in enumerate(s):
38+
right = max(right, pos[n])
39+
if i==right:
40+
result.append(right-left+1)
41+
left = right+1
42+
return result
43+
44+
# leetcode submit region end(Prohibit modification and deletion)

0 commit comments

Comments
 (0)