本帖最后由 March2615 于 2020-4-13 14:58 编辑
写完啦 感觉是这几天最不费脑子的了
- def daily374(arr: list) -> int:
- # 解题思路
- # 大小为i的数应该在arr[i]处
- # -> 遍历arr,如果index处max(arr[:index+1])是index则可以将前面分块
- # -> [1,0,2,3,4] -> [1,0|2|3|4]
- # -> [4,3,2,1,0,5] -> [4,3,2,1,0|5]
- max_value = ans = 0
- for index, value in enumerate(arr):
- max_value = max(max_value, value)
- if max_value == index:
- ans += 1
- return ans
复制代码
顺便思考了一下如果有重复的情况(稍微复杂了一点,但有了思路就很好写了)
- # 如果arr可以重复呢
- def daily374_1(arr: list) -> int:
- # 解题思路
- # arr[i] > arr[i+1]时需要排序 -> 遍历arr,记录下最大值
- # 如[1,2,1,3] -> [1,2,2,3] -> 分成[1|2,1|3]三块
- # 有个问题:[1,2,1,3,1,2,4] -> [1,2,2,3,3,3,4] -> [1|2,1|3,1,2|4] -> wrong
- # 解决方法:
- # 左边的最大值一定小于右边的最小值,找到符合的进行分段后继续对右边操作
- # [1,2,1,3,1,2,4] -> [1|2,1,3,1,2,4] -> [1|2,1,3,1,2|4]
- copy_arr = arr[:]
- ans = i =0
- while i < len(copy_arr)-1:
- i += 1
- left, right = max(copy_arr[:i]), min(copy_arr[i:])
- if left <= right:
- ans += 1
- copy_arr = copy_arr[i:]
- i = 0
- return ans + 1 # +1是最后一块
复制代码
不过感觉效率不会太高,while应该可以优化的 |