阿里巴巴笔试题
来源:互联网 发布:网络直播市场能火几年 编辑:程序博客网 时间:2024/06/18 17:45
题意:
给定一串数字
判断是否存在这三个元素,它们将数字串分为四个子串,其中每个子串的数字之和均相同(该3个元素不纳入计算)要求时间复杂度和空间复杂度均不能超过O(n)
思路:
奇妙的利用了单调性,枚举第一段的和, 第一段的和确定了,那么接下来的2,3,4段的和就都确定了,什么单调性呢? 就是i右移,j,k都要右移。这就是单调性了,第一段变大,那么234段都要变大,所以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 && sec == thi && thi == fou){printf("i = %d, j = %d, k = %d\n", i, j, k);return true;}}return false;}int main(){cin >> n;for(int i = 1; i <= n; i++){scanf("%I64d", &a[i]);sum[i] = sum[i - 1] + a[i];}puts(solve()?"YES":"NO");return 0;}
0 0
- 08阿里巴巴笔试题
- 阿里巴巴一道笔试题
- 阿里巴巴笔试题1.1
- 阿里巴巴笔试题1.2
- 阿里巴巴笔试题1.3
- 阿里巴巴笔试题1.4
- 阿里巴巴笔试题1.5
- 阿里巴巴笔试题
- 阿里巴巴笔试题
- 阿里巴巴笔试题
- 阿里巴巴DBA笔试题
- 阿里巴巴笔试题
- 阿里巴巴笔试题
- 阿里巴巴笔试题
- 阿里巴巴2013笔试题
- 阿里巴巴笔试题
- 阿里巴巴笔试题
- 一道阿里巴巴笔试题
- 关键段 互斥量 以及信号量
- BZOJ4771——七彩树
- HBase的核心模块介绍
- Android OkHttp完全解析
- Android进阶之路
- 阿里巴巴笔试题
- 【c#学习笔记】在一个构造方法中调用另一个构造方法的写法
- Leetcode 401
- AR入门系列-06-Vuforia文字识别
- 快速排序的Java实现
- 读取文件时用String的split()函数出现数组越界,但是实际应该有值
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat等使用详解
- 在一个页面上,一块区域上显示另一个页面(或者文件)的内容
- 阻塞队列实现的生产者/消费者模式