本文主要是介绍算法题:数串分组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
给定一串数字,判断是否存在这三个元素,它们将数字串分为四个子串,其中每个子串的数字之和均相同(该3个元素不纳入计算) 。要求时间复杂度和空间复杂度均不能超过O(n)。
思路:
方法1:
用一个大小为n的array[i]存储从开头一直加到num[i]的和值,用一个hashmap存储下array的下标和对应的和值,这样实现O(1)时间复杂度的查找。
先遍历一遍存下array和map。
然后遍历,穷举相同的和值,寻找三个下标,首先第一段设定为
方法2:宏定义四段的和,第一段是0到i-1,第二段是i+1到j-1,如果第二段比第一段小,应该将j往后移,一直移到两段相等,如果j到了末尾还是不相等,就进行i++,到下一段循环。如果找到了相等的第二段对应的j,再同理找相等的第三段对应的k,最后判断最后剩下的一段跟前三段是不是都相等,如果是,说明找到了。
#include <bits/stdc++.h>
using namespace std;
#define fir sum[i - 1]
#define sec sum[j - 1] - sum[i]
#define thi sum[k - 1] - sum[j]
#define fou sum[n] - sum[k]
typedef long long LL;
const int maxn = 1e5+100;
int n;
LL a[maxn], sum[maxn];
bool solve(){
for(int i = 1, j = 1, k = 1; i <= n; i++){while(fir > sec && j < n) j++; if(fir != sec) continue; //如果第一段大于第二段就一直右移,退出while,如果不等于,说明第二段大于第一段,就要重新移动第一段,扩大,如果想等,那么就下去移动第三段while(sec > thi && k < n) k++; if(sec != thi) continue; //第三段同理,最后检查第四段if(fir == sec &
这篇关于算法题:数串分组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!