Optimization 代码共犯问题
编写一个函数: 整数解(整数K,整数A[],整数N); 给定一个整数K和一个由N个整数组成的非空零索引数组a,返回数组a的有界_片数。 如果有界_切片的数量大于100000000,则函数应返回100000000。 例如,假设: A[0]=3 A[1]=5 A[2]=7 A[3]=6 A[4]=3 函数应该返回9,如上所述。 假设: •N是[1..100000]范围内的整数; •K是[0..100000000]范围内的整数; •数组A的每个元素都是范围内的整数[−1,000,000,000..1,000,000,000]. 复杂性: •预计最坏情况下的时间复杂度为O(N); •预期最坏情况下的空间复杂度为O(N),超出输入存储(不计算输入参数所需的存储)。 */ 我的代码没有在O(N)中运行,我想,有什么建议吗?? 导入java.util.ArrayList 公共类解决方案{Optimization 代码共犯问题,optimization,Optimization,编写一个函数: 整数解(整数K,整数A[],整数N); 给定一个整数K和一个由N个整数组成的非空零索引数组a,返回数组a的有界_片数。 如果有界_切片的数量大于100000000,则函数应返回100000000。 例如,假设: A[0]=3 A[1]=5 A[2]=7 A[3]=6 A[4]=3 函数应该返回9,如上所述。 假设: •N是[1..100000]范围内的整数; •K是[0..100000000]范围内的整数; •数组A的每个元素都是范围内的整数[−1,000,000,000..1,
/**
* @param args
*/
public int solution(int K, int[] A)
{
int numberOfSlices=0;
ArrayList<Integer>listOfSlices=new ArrayList<Integer>();
for(int i=0;i<A.length;i++)
{
for( int j=0;j<A.length;j++)
{
if((!listOfSlices.contains(A[i])
&&!listOfSlices.contains(A[j]))&&(max(A[i],A[j])-min(A[i],A[j]))<=K)
{
numberOfSlices++;
}
}
listOfSlices.add(A[i]);
}
return numberOfSlices;
}
/* return the max between two numbers */
public int max(int p,int q)
{
if(p>q)
{
return p;
}
else
{
return q;
}
}
/*return the min between two numbers */
public int min(int p,int q)
{
if(p<q)
{
return p;
}
else
{
return q;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution solution=new Solution();
int[] array={3,5,7,6,3};
System.out.println("the number of slices in the array is "+solution.solution(2, array));
}
/**
*@param args
*/
公共int解决方案(int K,int[]A)
{
int numberOfSlices=0;
ArrayListIstofslices=新的ArrayList();
对于(int i=0;i这个问题仍然有效,因此没有人会给出太多,但我将为您指出正确的方向(或者至少,远离错误的方向)
为循环嵌套是有风险的;实际上,您基本上是在保证O(N^2)。您需要找到一种减少池的方法,而不是对每个元素再次迭代
不过,正如您所看到的,这将使许多测试用例失败。如果蛮力失败,则意味着您缺少处理某些问题的方法。如完整描述中的问题警告
因此:
1) 认识到暴力强迫的速度比要求的要慢得多,想想如何减少需要搜索的内容
2) 写出一些古怪的测试用例,找出你的代码失败的地方和原因,然后重新考虑你的解决方案。答案不会是针对每一个用例的if语句
你的代码肯定失败(6,[ 4, 5, 8,5, 1, 4,6, 8, 7,2, 2, 5 ]),它应该返回44。考虑这个测试案例。
祝你好运。今天似乎每个人都在问同样的问题。如果你有任何建议,我们将不胜感激:)