lesson 6: sorting

exercise

Problem:

You are given a zero-indexed array A consisting of n > 0 integers; you must return the number of unique values in array A.

Solution O(nlogn):

First, sort array A; similar values will then be next to each other. Finally, just count the number of distinct pairs in adjacent cells.

def distinct(A):
n = len(A)
A.sort()
result = 1
for k in xrange(1, n):
if A[k] != A[k - 1]: result += 1
return result

The time complexity is O(n log n), in view of the sorting time.

1. Distinct

Compute number of distinct values in an array.

  • 将list保存为set 即可
  • Test score 100%
  • 也可以排序,然后对不同数进行计数,如exercise那样
def solution(A):
# write your code in Python 2.7
Aset = set(A)
return len(Aset)

2. Triangle

Determine whether a triangle can be built from a given set of edges.

https://codesays.com/2014/solution-to-triangle-by-codility/

On one hand, there is no false triangular. Since the array is sorted, we already know A[index] < = A[index+1] <= A[index+2], and all values are positive. A[index] <= A[index+2], so it must be true that A[index] < A[index+1] + A[index+2]. Similarly, A[index+1] < A[index] + A[index+2]. Finally, we ONLY need to check A[index]+A[index+1] > A[index+2] to confirm the existence of triangular.

On the other hand, there is no underreporting triangular. If the inequality can hold for three out-of-order elements, to say, A[index]+A[index+m] > A[index+n], where n>m>1. Again, because the array is sorted, we must have A[index] < = A[index+m-1] and A[index+m+1] <= A[index + n]. So A[index+m-1] +A[index+m] >= A[index]+A[index+m] > A[index+n] >= A[index+m+1]. After simplification, A[index+m-1] +A[index+m] > A[index+m+1]. In other words, if we have any inequality holding for out-of-order elements, we MUST have AT LEAST an inequality holding for three consecutive elements.

def solution(A):
# write your code in Python 2.7
length = len(A)
if length < 3:
return 0
A.sort()
for idx in xrange(0,length -2):
if A[idx]+A[idx + 1] > A[idx + 2]:
return 1
return 0

3. MaxProductOfThree

Maximize A[P] * A[Q] * A[R] for any triplet (P, Q, R).

solution 1

  • O(N)
  • Test score 100% OJ test is O(N * log(N))
  • 考虑到有负数存在, 故乘积最大的三个数,会出现在两种情况:
    • 三个数均是正数,且是三个最大的数
    • 两个负数和一个正数,最大正数和最小的两个负数
def solution(A):
ma1, ma2, ma3 = -1000, -1000, -1000
mi1, mi2 = 1000, 1000
for elem in A:
if elem > ma1:
ma1, ma2, ma3 = elem, ma1, ma2
elif elem > ma2:
ma2, ma3 = elem, ma2
elif elem > ma3:
ma3 = elem if elem < mi1:
mi1,mi2 = elem, mi1
elif elem < mi2:
mi2 = elem
a, b = ma1*ma2*ma3, ma1*mi1*mi2
return a if a > b else b

solution 2

note:

  • just need return the value of the max product,

  • 基于解法一,我们可以先排序,然后直接取,不需要每个比较,相对来说,时间成本稍大

  • so, we can just consider the first or last teiplet, after sort

  • Detected time complexity: O(N * log(N))

def solution(A):
A.sort()
return max(A[0]*A[1]*A[-1], A[-1]*A[-2]*A[-3])

4. NumberOfDiscIntersections

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.

problem:

Compute the number of intersections in a sequence of discs.

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.

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).

思路:

  • 参考csdn

  • stackoverflow

    initially we calculate all start and end points of discs. After go by all line and check count of discs inside current point. If in current point started some discs and intersection count increased by: already active distsc multiplied by count of started in current point (result += t * dps[i]) and count of intersections of started(result += dps[i] * (dps[i] - 1) / 2) eg. if started 5 discs in one of point it will increased by(1+2+3+4+5 intersections, or 5*(5-1) / 2[sum formula]).

  • 构造成区间,[i-A[i],i+A[i]]

    • e.g. A = [1,5,2,1,4,0]
    • => [-1,1],[-4,6],[0,4],[2,4],[0,8],[5,5]
  • 因为我们圆的中心位置在[0,len(A)],e.g. 在上例中 [0,5], 所以起点数组dps计算[0,i-A[i]]的范围,故有max(0,i-A[i])

  • 终点数组不要超过每个圆心的最大值,即小于len(A)-1, 故有min(length-1,i+A[i])

sloution:[100%]

def solution(A):
result = 0
length = len(A)
dps = [0]*length
dpe = [0]*length
for i in xrange(length):
dps[max(0, i-A[i])] += 1
dpe[min(length-1, i+A[i])] += 1
tmp = 0
for i in xrange(length):
if dps[i] > 0:
result += tmp*dps[i]
result += dps[i] * (dps[i] - 1)/2
if result > 10000000:
return -1
tmp += dps[i]
tmp -= dpe[i]
return result

sorting--codility的更多相关文章

  1. Codility NumberSolitaire Solution

    1.题目: A game for one player is played on a board consisting of N consecutive squares, numbered from ...

  2. codility flags solution

    How to solve this HARD issue 1. Problem: A non-empty zero-indexed array A consisting of N integers i ...

  3. HDU Cow Sorting (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1  ...

  4. GenomicRangeQuery /codility/ preFix sums

    首先上题目: A DNA sequence can be represented as a string consisting of the letters A, C, G and T, which ...

  5. 1306. Sorting Algorithm 2016 12 30

    1306. Sorting Algorithm Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description One of the f ...

  6. 算法:POJ1007 DNA sorting

    这题比较简单,重点应该在如何减少循环次数. package practice; import java.io.BufferedInputStream; import java.util.Map; im ...

  7. U3D sorting layer, sort order, order in layer, layer深入辨析

    1,layer是对游戏中所有物体的分类别划分,如UIlayer, waterlayer, 3DModelLayer, smallAssetsLayer, effectLayer等.将不同类的物体划分到 ...

  8. WebGrid with filtering, paging and sorting 【转】

    WebGrid with filtering, paging and sorting by Jose M. Aguilar on April 24, 2012 in Web Development A ...

  9. ASP.NET MVC WebGrid – Performing true AJAX pagination and sorting 【转】

    ASP.NET MVC WebGrid – Performing true AJAX pagination and sorting FEBRUARY 27, 2012 14 COMMENTS WebG ...

  10. poj 1007:DNA Sorting(水题,字符串逆序数排序)

    DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 80832   Accepted: 32533 Des ...

随机推荐

  1. word 杂记

    45.error和exception有什么区别? 答案:Error表示系统级的错误和程序不必处理的异常,我们无法处理它. Exception表示是可以捕捉或者需要程序进行处理的异常. 47.abstr ...

  2. MVC webapi,Action的分别拦截器

    继承Controller,ApiController的拦截继承的接口不一样 webapi的拦截器:(继承System.Web.Http) using System; using System.Coll ...

  3. 计算机基础教程11 - 互联网&内联网

    在本章中,我们将看到什么是Internet和Intranet,以及讨论两者之间的异同. 互联网 它是互联计算机网络的全球/全球系统.它使用标准的Internet协议(TCP / IP).Interne ...

  4. 一种不太合规的PreparedStatement使用方式

    这是一种不太合规的PreparedStatement调用使用方式 , 没有让Dao单独执行它单纯的任务. AccountDao.java package heartl_jdbc; /** * 银行操作 ...

  5. UOJ #122 【NOI2013】 树的计数

    题目链接:树的计数 这道题好神啊……正好有人讲了这道题,那么我就写掉吧…… 首先,为了方便考虑,我们可以把节点重标号,使得\(bfs\)序变成\(1,2,3,\dots,n\),那么显然树的深度就是\ ...

  6. php 添加时间戳

    <?php $tomorrow = mktime(,,,date(,date("Y")); echo "Tomorrow is ".date(" ...

  7. 获取主机的对外ip

    # curl -w "\n" ifconfig.me # curl -w "\n" ipinfo.io/json # curl -w "\n" ...

  8. 创建一个 SQLite 数据库

    首先,我们学习如何创建一个SQLite 数据库.如果想要在data/example.sqlite 这个路径中创建一个示例数据库,就必须确保该路径存在.如果该路径不存在,就必须先创建路径:if (!di ...

  9. Linux删除(清空)正在运行的应用日志文件内容 及 查看服务器剩余空间

    在测试环境定位问题时,如果发现日志文件内容太多或太大,有时需要删除该日志,如Tomcat,Nginx日志.以前每次都是先rm -rf ***.log,然后重启应用.直到后来发现了以下命令,原来可以不用 ...

  10. PHP如何生成文章预览图

    PHP如何生成文章预览图 一.总结 一句话总结:php的wkhtmltox扩展,php官方文档有怎么使用,或者github,或者百度,等等等等 wkhtmltox 1.PHP如何自动生成文章预览图? ...