Task description

We draw N discs on a plane. The discs are numbered from 0 to N − 1. A zero-indexed array A of N non-negative integers, specifying the radiuses of the discs, is given. The J-th disc is drawn with its center at (J, 0) and radius A[J].

We say that the J-th disc and K-th disc intersect if J ≠ K and the J-th and K-th discs have at least one common point (assuming that the discs contain their borders).

The figure below shows discs drawn for N = 6 and A as follows:

A[0] = 1 A[1] = 5 A[2] = 2 A[3] = 1 A[4] = 4 A[5] = 0

There are eleven (unordered) pairs of discs that intersect, namely:

  • discs 1 and 4 intersect, and both intersect with all the other discs;
  • disc 2 also intersects with discs 0 and 3.

Write a function:

class Solution { public int solution(int[] A); }

that, given an array A describing N discs as explained above, returns the number of (unordered) pairs of intersecting discs. The function should return −1 if the number of intersecting pairs exceeds 10,000,000.

Given array A shown above, the function should return 11, as explained above.

Assume that:

  • N is an integer within the range [0..100,000];
  • each element of array A is an integer within the range [0..2,147,483,647].

Complexity:

  • expected worst-case time complexity is O(N*log(N));
  • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

Elements of input arrays can be modified.

Solution

 
Programming language used: Java
Total time used: 4 minutes
 
Code: 15:38:12 UTC, java, final, score:  100
// you can also use imports, for example:
// import java.util.*; // you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message"); class Solution {
public int solution(int[] A) {
// write your code in Java SE 8
int l = A.length;
int[] arrayIn = new int[l];
int[] arrayOut = new int[l];
int inNumContext = 0;
int result = 0; for(int i = 0; i < l; i ++) {
int in = (i - A[i]) < 0 ? 0 : (i - A[i]);
// take care the (A[i] + i) exceeds the value of MAX int
// which will become minus int
int out = (A[i] + i > l - 1 || A[i] + i < 0) ? (l - 1) : (A[i] + i);
arrayIn[in] ++;
arrayOut[out] ++;
} for(int i = 0; i < l; i ++) {
if(arrayIn[i] != 0) {
// previous circles times new coming circles
result += inNumContext * arrayIn[i];
// new coming circles group with each other
result += arrayIn[i] * (arrayIn[i] - 1) / 2; if (result > 10000000) {
return -1;
} // add coming circles to inNumContext
inNumContext += arrayIn[i];
}
// minus leaving circles from inNumContext
inNumContext -= arrayOut[i];
} return result;
}
}

https://codility.com/demo/results/training5N9W8K-3M3/

最新文章

  1. Thrift-java实例
  2. 备忘: Install MODI for use with Microsoft Office 201x
  3. K2BPM怎么让金融数据更有意义?
  4. yousa_team团队项目——兼职平台网站 工作进度
  5. jmeter 构建一个LDAP测试计划
  6. [C语言 - 1.2] 类型说明符、字符、数组
  7. 实现View弹性滑动例子
  8. c++11的for新用法 (重新练习一下for_each)
  9. unique &amp;unique_copy
  10. Ubuntu下将vim配置为Python IDE(转)
  11. Cocos2d-x实现简单的翻牌效果
  12. MVC客户管理(添加、修改、查询、分页)
  13. [Codeforces Round #438][Codeforces 868D. Huge Strings]
  14. CentOS7的内核优化
  15. Qt 出现“undefined reference to `vtable for”
  16. BZOJ4964 : 加长的咒语
  17. Linux集锦
  18. 【SQL】如何使用SQL like 方法和SQL [charlist] 通配符(SQL like的拓展)
  19. Win7 无法访问Installer服务
  20. Ubuntu 下安装 Swoole

热门文章

  1. Linux的设备文件名与硬盘分区已经挂载点的关系
  2. Arcgis api for javascript学习笔记(4.5版本) - 点击多边形(Polygon)并高亮显示
  3. Ibatis之RowHandler
  4. 加减密 DES
  5. PCI GXL学习之安装篇
  6. Android中WebView的相关使用
  7. The Python Challenge 题解
  8. 制作简单的WPF时钟
  9. Efficient store queue architecture
  10. 重构qDebug()&lt;&lt;,使log输出到文件