LeetCode:圈地運動,求構成最小面積所需要的邊數
阿新 • • 發佈:2021-02-01
* 圈地運動,就是用很多木棍擺在地上組成一個面積大於0的多邊形~小明喜歡圈地運動,於是他需要去小紅店裡面買一些木棍, * 期望圈出一地來.小紅想挑戰一下小明,所以給小明設定了一些障礙.障礙分別是: * 1.如果小明要買第i塊木棍的話,他就必須把前I塊木棍都買下來. * 2.買了的木棍都必須用在圈地執行中. * 那麼請問小明最少買多少根木棍,才能使得木棍圍成的圖形是個面積大於0多邊形呢? * * 輸入描述:第一行一個數n,表示木棍個數. * 第二行n個數,第i個數表示第i個木棍的長度ai. * 1<=n<=10000 * 1<=ai<=10000 * 輸出描述:輸出一個數,表示最少需要的木棍個數,如果無解則輸出為-1. * * 解題思路: * 至少需要3根木棍才能構成封閉的圖形.而且從三角形的思路出發,任意兩邊之和必須大於第三邊. * 則多邊形前n個之和不包含最大值大於其最大值.
package movementOfEnclosure; import java.util.Scanner; public class Solution { public int enclosureMovement(){ Scanner in=new Scanner(System.in); int n=in.nextInt(); int[] nums=new int[n]; for(int i=0;i<n;i++){ nums[i]=in.nextInt(); } if(nums.length<3) return -1; //條件:n-1邊的和必須大於最長邊,就能組成封閉圖形 int sum=0,max=Integer.MIN_VALUE;//sum表示前n個數之和,max前n個數中的最大值 int ans=-1;//標記是否能構成最小面積 for(int i=0;i<nums.length;i++){ sum+=nums[i]; max=max>nums[i]?max:nums[i]; //如果i大於1(如果不大於1,說明只有兩條邊,無論如何也構不成),並且sum-max>max,即 //前n個數中不含max值之和大於max,則存在 if(i>1&&sum>2*max){ ans=i+1;//存在,則跳出 break; } } return ans; } public static void main(String[] args){ Solution so=new Solution(); System.out.println(so.enclosureMovement()); } }