求解 Python 面试题:

2017-07-11 13:33:42 +08:00
 sunhk25

求解 python 面试题:

def solution(A):
    N = len(A)
    result = 0
    for i in xrange(N):
        for j in xrange(N):
            if A[i] == A[j]:
                result = max(result, abs(i - j))
    return result

当数组极大时,效率不好,求如何改??!!

5735 次点击
所在节点    配件
41 条回复
ty89
2017-07-11 14:38:00 +08:00
悲剧,评论吞代码

![]( )
takeoffyoung
2017-07-11 15:03:41 +08:00
takeoffyoung
2017-07-11 15:04:42 +08:00
[Imgur]( )
di94sh
2017-07-11 15:15:32 +08:00
这样时间复杂度是不是 O(N)
[Imgur]( http://imgur.com/a/zTNYd)
di94sh
2017-07-11 15:16:08 +08:00
Yvette
2017-07-11 15:45:32 +08:00
没看错的话作用是求数组中相同值的最远距离吗,可以先 enumerator 之后根据 key 排序再找相同字段的最大长度,算法刚开始学不太懂怎么算时间复杂度……懂得麻烦帮忙看下

zlin3000
2017-07-11 16:27:49 +08:00
因为是求最远相同元素距离,感觉可以从最远距离直接下手,即最大的可能最远距离只有一种,即第一个元素和最后一个元素,下一层可能得到最远距离的是两种即第一个和倒数第二个,第二个和倒数第一个,然后以此类推。
backto17
2017-07-11 16:29:34 +08:00
@gimp o(n), 另外可以用 defaultdict, 可以少了自己去判断存不存在
aaronzjw
2017-07-11 16:31:49 +08:00
考虑下哪些元素重复,然后对重复的元素进行计算
zlin3000
2017-07-11 16:40:51 +08:00
这么一说,如果不考虑空间成本的情况下,时间应该是 O(n),遍历数组,用字典记住每个元素出现的最初位置,然后一个 max value 记入当前最远距离。
aaronzjw
2017-07-11 16:49:07 +08:00
QAPTEAWH
2017-07-11 17:56:04 +08:00
动态规划
D(i,j) =
j - i, if item[i] = item[j], or
max{D(i+1, j), D(i, j-1)}
cxyfreedom
2017-07-11 18:27:48 +08:00
```
max([(len(l) - l[::-1].index(i) - 1) - l.index(i) for i in set(l)])
```
sky101001
2017-07-11 19:11:11 +08:00
第一反应是排序复杂度是 O(nlogn),再比较相邻元素,复杂度是 O(n),选出最大间隔 O(nlogn)。最终时间复杂度可以是 O(nlogn)。
不过总觉得有更快的方法,容我想想
xiaket
2017-07-12 06:49:25 +08:00
@Livid 从回复看,绝大多数人都希望回复支持 markdown, 至少求添加对代码块的支持....
ArcticL
2017-07-12 14:24:43 +08:00
@zlin3000 有一点是当 result 越小,甚至等于 0 时,时间成本比原方案更大
def solution(A):
arrayLength = len(A)
for result in range(arrayLength, -1, -1):
for i in range(arrayLength):
if i + result < arrayLength and A[i] == A[i + result]:
return result
zlin3000
2017-07-12 18:07:18 +08:00
@ArcticL
原方案时间复杂度 是 固定的 O ( n^2 )
我的第一个方案,最差 case 是 O ( n^2 ),1 + 2 + 3 + 4 + 5 + ... + n-1 = (n*(n-1))/2
所以 时间成本并不会比原方案更大。
ArcticL
2017-07-12 20:19:48 +08:00
@zlin3000 有代码么?这些概念的东西不好理解。。。
zlin3000
2017-07-13 01:58:51 +08:00
@ArcticL 代码:
```python

def solution(A):
# 两个元素之间的可能最长距离为数组长度-1
max_dist = len(A) - 1

# 从最长距离开始逐渐往下递减
for dist in range(max_dist, 0, -1):
# 因为是按距离长度查找, 固每次只要查看可能可以达成当前长度距离的数组
# 所以第一次只能是 第一个元素和最后一个元素;
# 第二次是第一个和倒数第二个, 第二个和最后一个元素; 第三次可以此类推
# 因此是 1 + 2+ 3 + ... + n-1
for i in range(len(A) - dist):
if A[i] == A[i+dist]:
return dist

# 如果循化结束没有答案,则表示没有匹配数组
return 0

```
ArcticL
2017-07-13 09:41:12 +08:00
@zlin3000 哦,我懂了,当 result=0 时,虽然我判断了,但第二层循环等于又完全遍历了,是这个意思吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/374491

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX