Fork me on GitHub

力扣 2089. 找出数组排序后的目标下标

排序 + 查找

  1. 排序: 快速排序
1
2
3
4
5
6
7
8
9
10
def sort_b2s(nums, left, right):
if left >= right: return
i, j= left, right
while i < j:
while nums[j] > nums[left] and i < j: j -= 1
while nums[i] <= nums[left] and i < j: i += 1
nums[i], nums[j] = nums[j], nums[i]
nums[i], nums[left] = nums[left], nums[i]
sort_b2s(nums, left, i - 1)
sort_b2s(nums, i + 1, right)
  1. 查找: 二分查找
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def search_left(nums, left, right, x):
while left < right:
mid = left + right >> 1
if nums[mid] >= x:
right = mid
else:
left = mid + 1
return left


def search_right(nums, left, right, x):
while left < right:
mid = left + right + 1 >> 1
if nums[mid] > x:
right = mid - 1
else:
left = mid
return left

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

双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
len_1, len_2 = len(nums1), len(nums2)
len_1a2 = len_1 + len_2
mid = len_1a2 >> 1

l1, l2 = 0, 0
s, m = 0, 0
while mid >= 0:
if l1 < len_1 and l2 < len_2:
if nums1[l1] > nums2[l2]:
cur = nums2[l2]
l2 += 1
else:
cur = nums1[l1]
l1 += 1
elif l1 < len_1:
cur = nums1[l1]
l1 += 1
else:
cur = nums2[l2]
l2 += 1
s, m = m, cur
mid -= 1
return float(s + m) / 2 if not len_1a2 % 2 else float(m)

力扣 5. 最长回文子串

中心扩散法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def longestPalindrome(s):
def expend_substr(left, right):
while left >= 0 and right < s_l and s[left] == s[right]:
left -= 1
right += 1
return left + 1, right - 1

# 最终回文的始终
start, end, s_l = 0, 0, len(s)
for i in range(s_l):
# 偶数回文
left, right = expend_substr(i, i + 1)

if right - left > end - start:
start, end = left, right

# 奇数回文
left, right = expend_substr(i, i)

if right - left > end - start:
start, end = left, right

return s[start: end + 1]

动态规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def longestPalindrome(s):
s_len = len(s)
if s_len < 2:
return s
dp = [[False] * s_len for _ in range(s_len)]
for i in range(s_len):
dp[i][i] = True

max_len, start = 1, 0
# 回文长度
for l in range(2, s_len + 1):
# 回文字符起始位置
for st in range(s_len):
ed = l + st - 1
if ed >= s_len:
break
if s[st] != s[ed]:
dp[st][ed] = False
else:
if l <= 3:
dp[st][ed] = True
else:
dp[st][ed] = dp[st + 1][ed - 1]

if dp[st][ed] and l > max_len:
max_len = l
start = st
return s[start: start + max_len]
  • Copyrights © 2022 eightyninth
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信