空间复杂度估算:
一般题目复杂度:256M -> 8e7个 int
写代码之前要清楚自己能不能用双重for循环
子问题能否在O(1)内解决
- 什么是序列的子区间:
数组:子序列(长度为k的子序列,按顺序取子集,不一定连续,但是要按顺序排)、子区间(连续,按顺序) - 什么是空间复杂度
- 转换等式解题思维
- 桶的应用
第一次尝试:MLE、TLE
package niuke;
import java.util.ArrayList;
import java.util.Scanner;
public class CadolliAndTheUniverse {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int n= sc.nextInt();
int cnn= 0;
ArrayList<Integer> arr = new ArrayList<>();
ArrayList<Integer> newArr = new ArrayList<>();
for (int i=0;i<n;i++){
arr.add(sc.nextInt());
}
//前缀和
int []sum= new int[n];
for (int i=0;i<n;i++){
if (i==0)sum[i]=arr.get(i);
else sum[i]=sum[i-1]+arr.get(i);
}
//计算子区间的和
for (int j=0;j<n;j++){
for (int k=j;k<n;k++){
if (j==k){
newArr.add(arr.get(j));
}else {
newArr.add(sum[k]-sum[j]+arr.get(j));
}
}
}
for (int i=0;i<newArr.size();i++){
if (newArr.get(i)==0){
cnn++;
}else {
Double L=Math.sqrt(newArr.get(i));
int R=(int)Math.floor(Math.sqrt(newArr.get(i)));
if (L-R == 0){
cnn++;
}
}
}
System.out.println(cnn);
}
}
第二次尝试:
package niuke;
import java.util.ArrayList;
import java.util.Scanner;
public class CadolliAndTheUniverse {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int n= sc.nextInt();
int cnn= 0;
ArrayList<Integer> arr = new ArrayList<>();
for (int i=0;i<n;i++){
arr.add(sc.nextInt());
}
//前缀和
int []sum= new int[n];
int[] tong = new int[1000001];
for (int i=0;i<1000001;i++){
tong[i]=0;
}
for (int i=0;i<n;i++){
if (i==0){
sum[i]=arr.get(i);
tong[sum[i]]=1;
}
else {
sum[i]=sum[i-1]+arr.get(i);
tong[sum[i]]=1;
}
}
//计算子区间的和
for (int i=0;i<n;i++){
//转换等式思维f(i)-j*j=f(j)
for (int j=0;sum[i]-j*j>=0;j++){
cnn+=tong[sum[i]-j*j];
}
}
System.out.println(cnn);
}
}