中级农民
- 积分
- 110
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-8-9
- 最后登录
- 1970-1-1
|
# 2020/1/22
436. Maximal Square
二维 dp,dp[i][j] -> 正方形边,dp[i][j] = min(top, left, top_left) + 1,注意边界情况 i == 1 or j === 1 return 1
122. Largest Rectangle in Histogram
单调栈,一直保持递增。遇到递减的: heights[stack[-1]] >= heights[i],就一直弹出一个 prev_height,找到左边界,更新 rectangle -> (i - heights[stack[-1]] - 1 | i) * heights[i],注意最后要加上 -1,在最后一次将所有都弹出
510. Maximal Rectangle
设置 heights 数组,统计每一列的高度,就可以转换成 122. Largest Rectangle in Histogram 的问题。每一行都做一次 122 的求解,对比最大 rectangle
697. Sum of Square Numbers
判断是否 < 0,判断是否可以开根号,将 sprt(num) 作为 upperbound,从 j = 1 -> upperbound 去找是否存在 i * i + j * j == num,j = int(sprt(num - i * i))
64. Merge Sorted Array
设置 position 指针,两个数组从后往前判断哪个大,哪个大就加入到对应在的 position 位置
6. Merge Two Sorted Arrays
先处理 i < m and i < n 再处理 i < m 和 i < n 的情况,指针一起往前
839. Merge Two Sorted Interval Lists
还是和 Merge Two Sorted Arrays 一样,这次的判断条件是 l1[i1].start < l2[i2].start,然后 push_back。push_back 里要针对当前结果最后一个 interval 的 end 来处理: last.end < start -> 直接 append,否则 last.end = max(last.end, curt.end)
212. Space Replacement
计算 true length = length + 2 * space_counts,调协双指针:index = true_length - 1, i - length - 1,从后往前修改 string
56. Two Sum
Super easssssy,用 dictionary 和双指针(比较麻烦)都能做
608. Two Sum II - Input array is sorted
双指针,nums[left] + nums[right] < target -> left += 1 else right -= 1, == target -> return [left + 1, right + 1]
607. Two Sum III - Data structure design
这里用一个 dictionary 去存 { num : count },每次要分是否 target - num == num 去判断。和 Two Sum 有点类似,但是这里多了去重的操作,其实大可以将他们变成数组,每次都用 Two Sum 去做,但是这样 worse case 可能复杂度变高了,例如 [2, 2, 2, 2...]
689. Two Sum IV - Input is a BST
中序遍历,遍历左节点的时候加入 target - left_root.val,在遍历到右节点的时候就判断 right_root.val 是否在 node_set 里即可
1797. optimalUtilization
双指针,left 在 A,right 在 B,初始 optimal 是 A[0] + B[0],每次 A[left] + B[right] 都和 optimal 对比,前提是 A[left] + B[right] <= K and > optimal,如果 > K 或者 right 有重复,就 right -= 1
609. Two Sum - Less than or equal to target
先 sorted 数组,在 A[left] + A[right] <= target 的时候 counts += right - left,left += 1,否则 right -= 1
443. Two Sum - Greater than target
和上题同理,取反即可
610. Two Sum - Difference equals to target
nums -> pairs (nums, i), 排序 lambda x: x[0],abs(target),固定 i, j = i + 1 -> n - 1,如果 diff < target,j += 1, > target 就 break,相等就返回结果
587. Two Sum - Unique pairs
注意去重
382. Triangle Count
i: n - 1 -> 0,nums[i] 作为 target,然后变成了 443. Greater than target
57. 3Sum
two sum 基础上包一层 i: 0 -> n - 3,其中 target = -numbers[i], left = i + 1, right = length - 1
58. 4Sum
3Sum 基础上包一层 i: 0 -> n - 4
59. 3Sum Closest
3Sum 基础上每次都判断是否更 closer |
|