题目
题目链接:
https://www.nowcoder.com/practice/857d6f49e3ee4e568cc243cbf9956efd
思路
前缀和
前缀和的概念:前缀和是指数组中从开始位置到当前位置的所有位置的元素之和,
它可以通过累加数组元素来计算,一般来说,我们可以使用前缀和数组在常数
时间复杂度内计算任意区间的和.
注意:特别是需要频繁的计算区间和的情况,可以通过先预先计算前缀和数组,
可以将时间复杂度从O(n)降到O(1)
参考答案Java
java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int findRainbow (int[] nums) {
/*
前缀和数组
题目有歧义,不是子序列,而是子数组,连续的
*/
int n = nums.length;
int[] psum = new int[n + 1];
for (int i = 0; i < n ; i++) {
psum[i + 1] = psum[i] + nums[i];
}
for (int i = 0; i <= n ; i++) {
for (int j = 0; j < i ; j++) {
int diff = psum[i] - psum[j];
if (diff % 7 == 0) return 1;
}
}
return 0;
}
}
参考答案Go
go
package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
func findRainbow(nums []int) int {
/*
前缀和数组
题目有歧义,不是子序列,而是子数组,连续的
*/
n := len(nums)
psum := make([]int, n+1)
for i := 0; i < n; i++ {
psum[i+1] = psum[i] + nums[i]
}
for i := 0; i <= n; i++ {
for j := 0; j < i; j++ {
diff := psum[i] - psum[j]
if diff%7 == 0 {
return 1
}
}
}
return 0
}
参考答案PHP
php
<?php
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
function findRainbow( $nums )
{
/*
前缀和数组
题目有歧义,不是子序列,而是子数组,连续的
*/
$n = count($nums);
$psum=[0=>0];
for ($i=0;$i<$n;$i++){
$psum[$i+1] = $psum[$i]+$nums[$i];
}
for ($i=0;$i<=$n;$i++){
for($j=0;$j<$i;$j++){
$diff = $psum[$i]-$psum[$j];
if($diff%7==0) return 1;
}
}
return 0;
}