为了练习和提高我的编程技巧,我决定解决InterviewStreet上的问题。我决定开始使用简单的InsertionSort(我希望它很简单)。 https://www.interviewstreet.com/challenges/dashboard/#problem/4e90477dbd22b 我能得到正确的答案。但是运行时是个问题。测试用例的最大允许运行时间为5秒。但是我会略微过火。 我使用了一些技巧(比如从代码中删除一些东西。存储str.lenght()等的结果)。但是我仍然略显落伍。
十个测试用例的当前运行时间为:
1成功通过0.160537
2成功通过0.182606
3成功通过0.172744
4成功通过0.186676
5超出时间限制失败。 5.19279
6超出时间限制失败。 5.16129
7成功通过2.91226
8超出时间限制失败。 5.14609
9超出时间限制失败。 5.14648
10超出时间限制失败。 5.16734
我不知道测试用例是什么。 请帮助我改进运行时。 谢谢。
import java.util.Scanner;
import java.io.*;
//import java.io.BufferedWriter;
//import java.io.FileInputStream;
//import java.io.FileOutputStream;
public class Solution {
public static int[] A=new int[100001];
public static int swap=0;
public static void InsertionSort(int n){
for (int i=1; i<=n; i++){
for (int var=i; var>0; var--){
if (A[var]<A[var-1]){
int temp=A[var-1];
A[var-1]=A[var];
A[var]=temp;
swap++;
}
else {
break;
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int number_of_cases =Integer.parseInt(str);
int counter;
int [] spacearray = new int[100000];
for (int j=0; j<number_of_cases; j++){
swap=0;
str = br.readLine();
int arraylength = Integer.parseInt(str);
str = br.readLine();
counter=0;
int strlen=str.length();
for (int i=0; i<strlen-1; i++){
if (str.charAt(i) == ' '){
spacearray[counter]=i;
counter++;
}
}
spacearray[counter]=strlen;
A[0]=Integer.parseInt(str.substring(0, spacearray[0]));
for (int i=1; i<=arraylength-1; i++){
A[i] = Integer.parseInt(str.substring(spacearray[i-1]+1,spacearray[i]));
}
InsertionSort(arraylength-1);
System.out.println(swap);
}
}
}
答案 0 :(得分:0)
使用二进制索引树来解决此问题
答案 1 :(得分:0)
这里的瓶颈是插入排序算法。它的时间复杂度为O(n ^ 2),n高达10 ^ 5,在访谈街判断机上很容易超过5秒。此外,当抛出TLE信号时,程序停止执行。因此,5的轻微开销并不是实际运行所需时间的指标。它是由检测TLE和停止执行之间的延迟引入的。
为了历史,这个问题最初是作为codesprint-1的一部分出现的。使用插入排序不是在这里继续进行的方式,否则这个问题将完全放弃。
<强>提示强>
使用所有值都在[1,10 ^ 6]范围内的事实。你在这里真正做的是找到数组A中的反转次数,即找到所有i&lt; j s.t. A [i]&gt; A [J]。考虑一种数据结构,它允许您以对数时间复杂度(如Binary Indexed Trees)查找每个插入操作所需的交换次数。当然,还有其他方法。