中级农民
- 积分
- 106
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2020-10-27
- 最后登录
- 1970-1-1
|
第一题我的思路是:
1) 拿两个单调栈monotonic stack从左向右和从右向左各扫一遍,把坐标扔一个set里面,可以得到所有不遵守规定的点
2) 然后是判断地狱,如果没有点,如果有 一个点,如果有两个点,如果有超过两个点。
3) 要是超过两个点,就找出最两头的俩点,先看俩点要是掉能不能塞回去,然后把中间的倒排序,要是倒序完了跟原来子串一样,说明之前就是倒序的,那翻转后应该ok
我写了几个test case看着像是对的,不知道对题意理解对不对
- def is_almost_sorted(arr):
- stack = []
- points = set()
- for i in range(len(arr) - 1, -1, -1):
- n = arr[i]
- if len(stack) > 0 and n > arr[stack[-1]]:
- points.add(stack.pop())
- stack.append(i)
- stack = []
- for i in range(len(arr)):
- n = arr[i]
- if len(stack) > 0 and n < arr[stack[-1]]:
- points.add(stack.pop())
- stack.append(i)
- if len(points) == 0:
- return True
- if len(points) == 1:
- return False
- if len(points) == 2:
- return True
- l, r = min(points), max(points)
- if (l > 0 and arr[r] >= arr[l - 1]) and (r < len(arr) - 1 and arr[l] <= arr[r + 1]) and \
- sorted(arr[l:r + 1], reverse=True) == arr[l:r + 1]:
- return True
- return False
复制代码
|
|