Python:每日一题 375
今天的题目:给定一个整数数组,寻找连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
返回在找出的子数组中最短的子数组的长度。
示例:
输入:
输出:5
解释:你只需要对 进行升序排序,那么整个表都会变为升序排序。
{:10_298:}欢迎大家一起答题!{:10_298:} 本帖最后由 kinkon 于 2020-4-15 13:38 编辑
不知道理解对不对
def f375(arr):
new = sorted(arr)
if new == arr:
return 0
l, r = 0, len(arr) - 1
while l <= r and new == arr or new == arr :
if new == arr:
l += 1
if new == arr:
r -= 1
return r - l + 1
再来一个O(n)的
def f375(arr):
n = len(arr)
rp, lp = arr, arr[-1]
l, r = n, 0
for i in range(1, n):
if arr >= rp:
rp = arr
else:
r = i
for i in range(n - 2, -1, -1):
if arr <= lp:
lp = arr
else:
l = i
return r - l + 1 if r > l else 0 占楼 本帖最后由 TJBEST 于 2020-4-14 20:27 编辑
先来一个弱智的方法,可能比较慢。
def fun375(arr):
M = len(arr)
sorted_arr = sorted(arr)
for left in range(0,M):
if arr == sorted_arr:
continue
else:
break
else:
return 0
for right in range(M-1,left-1,-1):
if arr == sorted_arr:
continue
else:
break
return right - left + 1 占个楼 好难
本帖最后由 March2615 于 2020-4-14 15:08 编辑
这两天不是做隔夜题感觉都简单了呢
# 解题思路:
# 比较原列表和排序后的列表,找出从左往右和从右往左最先不同的位置
# 中间的即为最小子数组 -> 相减即可得到长度
def daily375(arr: list) -> int:
sort_arr = sorted(arr)
left, right = 0, len(arr)-1
for i in range(len(arr)):
if arr == sort_arr:
left += 1
else:
break
for j in range(len(arr)-1, -1, -1):
if arr == sort_arr:
right -= 1
else:
break
if left >= right:
return 0
else:
return right - left + 1
写的短一点的话
def daily375(arr: list) -> int:
diff_index =
if diff_index:
return max(diff_index) - min(diff_index) + 1
else:
return 0 list1 = eval(input())
list2 = sorted(list1)
p , q = 0 , len(list1)-1
a = 0
while True:
if list1 == list2 or list1 ==list2:
p = p + 1
q = q - 1
else:
break
print('',format(q-p+1))
应该可以吧。。。 本帖最后由 ouyunfu 于 2020-4-14 16:07 编辑
def f375(arr):
a=sorted(arr)
b = !=a]
return b[-1]-b+1 def new_sort(list):
a = len(list)
for each in list:
if each == min(list):
a -= 1
else:
break
for each in reversed(list):
if each == max(list):
a -=1
else:
break
print(a)
def func375(arr):
temp = sorted(arr)
length = len(arr)
maxs = 0
mins = 0
for i in range(length):
if temp != arr:
mins = i
break
for i in range(length-1,mins,-1):
if temp !=arr:
maxs = i
break
return maxs-mins+1 本帖最后由 旅途Z 于 2020-4-15 23:33 编辑
总觉得写的有多余的部分,已修改,没有想到顺序情况返回值有问题
import numpy as np
def partial_sort(array):
equal_array = np.array(array).argsort()
head = 0
tail = len(equal_array)-1
flag1 = 0
flag2 = 0
while head < tail:
if equal_array != head:
flag1 = 1
if equal_array != tail:
flag2 = 1
if flag1 and flag2:
break
elif not flag1:
head += 1
elif not flag2:
tail -= 1
if not flag1 and not flag2:
return 0
else:
return tail-head+1 def fun375(a):
b=sorted(a)
if a==b:return 0
for i in range(len(a)):
if a!=b:
l=i
break
for j in range(-1,-len(a),-1):
if a!=b:
r=len(a)+j+1
break
return r-l 本帖最后由 776667 于 2020-4-15 09:13 编辑
def fun375(x):
sorted_x = sorted(x)
if sorted_x == x:
return 0
for i in range(len(x)):
if x != sorted_x:
start = i
break
for i in range(len(x))[::-1]:
if x != sorted_x:
end = i
break
return end - start + 1 只有我一个人没看懂什么意思吗,什么是连续的子数组,给的例子是输入:
输出:5,这里面的值没有一个是连续的吧,所以他的子数组是啥,完全没搞懂题目的意思 岚冰1234 发表于 2020-4-15 10:54
只有我一个人没看懂什么意思吗,什么是连续的子数组,给的例子是输入:
输出:5, ...
最后要按升序排序的,,就得把这5个元素拿出来排成升序再放回去变成,应该是这个意思了 kinkon 发表于 2020-4-14 13:35
不知道理解对不对
第一段代码的 nums 是……? kinkon 发表于 2020-4-14 13:35
不知道理解对不对
第二段代码 50 ms TJBEST 发表于 2020-4-14 13:46
先来一个弱智的方法,可能比较慢。
43 ms March2615 发表于 2020-4-14 14:28
这两天不是做隔夜题感觉都简单了呢
63 ms