python-3.x - 降低比较连续子阵列的时间复杂度?
问题描述
所以说我有一个这样的列表序列。
我想删除其总和 = N 和/或它具有总和 = N 的连续子数组的所有序列。
例如,如果 N = 4,则 (1,1,2) 无效,因为其总数为 4。(1,1,3) 也无效,因为 (1,3) 也是 4。 (1, 3,1) 也因同样的原因无效。
lst = [
(1,1,1), (1,1,2), (1,1,3),
(1,2,1), (1,2,2), (1,2,3),
(1,3,1), (1,3,2), (1,3,3),
(2,1,1), (2,1,2), (2,1,3),
(2,2,1), (2,2,2), (2,2,3),
(2,3,1), (2,3,2), (2,3,3),
(3,1,1), (3,1,2), (3,1,3),
(3,2,1), (3,2,2), (3,2,3),
(3,3,1), (3,3,2), (3,3,3)
]
例如
Input: 4 3
Output: 2 1 2
所以我现在拥有的是
lst = [t for t in list(product(range(1,n),repeat=n-1)) if not any((sum(t[l:h+1]) % n == 0) for l, h in combinations(range(len(t)), 2))]
如果我没记错的话,目前它在 O(n 2 ) 中。有什么更好的方法来做到这一点?
解决方案
如果您可以使用numpy
,您可以将每个元组的总和与连续值总和连接起来,然后检查您的任何结果元素是否等于 4:
arr = np.array(lst)
arr[~(np.concatenate((np.sum(arr,axis=1).reshape(-1,1),
(arr[:,:-1]+ arr[:,1:])),axis=1) == 4).any(1)]
# or:
arr[(np.concatenate((np.sum(arr,axis=1).reshape(-1,1),
(arr[:,:-1]+ arr[:,1:])),axis=1) != 4).all(1)]
返回:
array([[1, 1, 1],
[1, 2, 3],
[2, 1, 2],
[2, 3, 2],
[2, 3, 3],
[3, 2, 1],
[3, 2, 3],
[3, 3, 2],
[3, 3, 3]])
推荐阅读
- node.js - 如何在 Sequelize 的“findByPk”语句中同时使用“include”和“attributes”?
- java - 接口类允许静态成员方法到实例成员方法重新声明,但类类或接口接口不允许
- git-extensions - 如何滚动到 GitExtensions 中的当前提交?
- flutter - Flutter Web:TextOverflow.ellipsis 不适用于自定义字体和 rtl 语言
- python - Pythonanywhere 等待
- arrays - 如何按升序排列结构数组中的结构?
- docker - Apache Nifi(在 docker 上):一次只能配置 HTTP 和 HTTPS 连接器之一错误
- android - Google Sheet Script,是否可以让android手机根据特定的单元格选择显示键盘输入?
- firebase-cloud-messaging - Codeigniter4 无法加载文件 firebase-messaging-sw.js 并出现错误无法执行“importScripts”
- jestjs - 如果控制台错误计数增加,则玩笑测试套件失败