360算法试题--小明的圈地运动
圈地运动
http://www.nowcoder.com/questionTerminal/37554f9e45404fa785bd029e5f08280e
1. 思路
(1)最重要的一点:
- 构成多边形的条件: 其他边之和大于最长边
- 边数大于3
(2)根据题目要求可知,依次检索,达到条件就输出,时间复杂度O(n)
(3)第i个点与前i-1个点,只有和的关系(其实是减去最大值的和),所以不需要。
2.在循环读入时所要记录的数据
- 前i项和sum
- 前i项中的最大值MaxNum
- 前i项和减去最大值sumSubMax
3. 判断逻辑
在循环体内判断MaxNum-sumSubMax < 0?成立直接输出i+1(i从零开始),break;不成立,循环。当i = n-1时仍然不成立输出-1
4. Code
Scanner sc = new Scanner(System.in); int n = sc.nextInt(); if (n < 3) { System.out.println(-1) ; } int sum; int temp; int maxNum = sum = sc.nextInt(); for (int i = 1; i < n; i++) { maxNum = (temp = sc.nextInt()) > maxNum? temp : maxNum; sum += temp; int SumSubMax = sum - maxNum; if (i > 1) { if (maxNum < SumSubMax) { System.out.println(i+1) ; break; } if (i == n-1) { System.out.println(-1) ; } } }