我正在解决“美丽的三胞胎”的问题可能是我的逻辑是正确的,但它显示了计时问题的问题是下面的图片中给出的。我的解决方法同样是下面给出的。它只包含给定的函数beautifultriplets(int d,int[]arr),它返回整数并接受两个值一个是d,另一个是整数数组。一些案例正在运行,但有些案例显示计时错误。
问题是
问题
同样的解决方案是
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;
public class Solution {
// Complete the beautifulTriplets function below.
static int beautifulTriplets(int d, int[] arr) {
int i,j,k,beautifulTripletsCount=0;
for(i=0;i<(arr.length-2);i++)
{
for(j=i+1;j<(arr.length-1);j++)
{
for(k=j+1;k<(arr.length);k++)
{
if(i<j&& j<k)
{
int j_i_Difference=arr[j]-arr[i];
int k_j_Difference=arr[k]-arr[j];
if(j_i_Difference==k_j_Difference && k_j_Difference==d)
{
beautifulTripletsCount++;
}
}
}
}
}
return beautifulTripletsCount;
}
private static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
String[] nd = scanner.nextLine().split(" ");
int n = Integer.parseInt(nd[0]);
int d = Integer.parseInt(nd[1]);
int[] arr = new int[n];
String[] arrItems = scanner.nextLine().split(" ");
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
for (int i = 0; i < n; i++) {
int arrItem = Integer.parseInt(arrItems[i]);
arr[i] = arrItem;
}
int result = beautifulTriplets(d, arr);
bufferedWriter.write(String.valueOf(result));
bufferedWriter.newLine();
bufferedWriter.close();
scanner.close();
}
}
2条答案
按热度按时间dvtswwa31#
3个嵌套循环的解决方案的运行时间为
O(n^3)
.你可以把它改进成
O(n^2)
具体如下:让
i
从1
至arr.length - 2
. 找出其中美丽的三胞胎的数目arr[i]
是中间元素:迭代自
i-1
下到0
计算元素的个数arr[i] - d
迭代自i+1
高达arr.length - 1
计算元素的个数arr[i] + d
把你在前两步中找到的两个数字相乘,然后把乘积加到美丽的三胞胎总数上。这将使您的总运行时间
O(n^2)
即使输入数组没有排序。如果对输入数组进行排序,您可以做得更好,因为步骤2。和3。可以做二进制搜索,因此采取
O(logn)
而不是O(n)
. 这将使您的总运行时间O(nlogn)
.常规(未排序)数组的版本:
kknvjkwl2#
我改进计时的方法是做一个循环,在数组中找到索引j和k,将d加到i和j处的值上。我使用了java的二进制搜索实现。