给你一个整数 n,请你返回 任意 一个由 n 个 各不相同 的整数组成的数组,并且这 n 个数相加和为 0 。
输入:n = 5
输出:[-7,-1,1,3,4]
解释:这些数组也是正确的 [-5,-1,1,2,3],[-3,-1,2,-2,4]。
输入:n = 3
输出:[-1,0,1]
输入:n = 1
输出:[0]
提示:
1 <= n <= 1000
Problem: 1304. 和为零的 N 个不同整数
题目相对宽松所以主要利用相反数为原理(即两侧相加等于0)进行解答。
如果n为偶数个那么就用(n/2)当作初始数组的个数
如果n为奇数个那么就用(n-1/2)当作初始数组的个数
因为n<=1000,所以我们随机取1-500即可(因为运用相反数)。
最后循环初始数组,把每一个数对应的相反数进行追加。
如果n为奇数,在循环追加的数组最后一个key(就是n本身)追加0(因为我们取随机数从1-500取的所以0是为了n为奇数存在预留出来的)。
代码公共部分可以提取简化
class Solution {
/**
* @param Integer $n
* @return Integer[]
*/
function sumZero($n) {
if($n==1){
return [0];
}
//如果是偶数个
if($n%2==0){
$half = $n/2;
//range 是将1000到9999 列成一个数组
$numbers = range (1,500);
//shuffle 将数组顺序随即打乱
shuffle ($numbers);
//array_slice 取该数组中的某一段
$result = array_slice($numbers,0,$half);
foreach($result as $k=>$v){
$result[$k+$half] = -$result[$k];
}
return $result;
}else{
$half = ($n-1)/2;
//range 是将1000到9999 列成一个数组
$numbers = range (1,500);
//shuffle 将数组顺序随即打乱
shuffle ($numbers);
//array_slice 取该数组中的某一段
$result = array_slice($numbers,0,$half);
foreach($result as $k=>$v){
$result[$k+$half] = -$result[$k];
}
$result[$n] = 0;
return $result;
}
}
}