class Solution { public int minSubArrayLen(int target, int[] nums) { int n = nums.length, ans = n + 10; int[] sum = new int[n+10]; for(int i = 1;i <= n;i++) sum[i] = sum[i-1] + nums[i-1]; for(int i = 1;i <= n;i++){ int s= sum[i], d = s - target; int l = 0, r = i; while(l < r){ int mid = l + r + 1 >> 1; if(sum[mid] <= d) l = mid; else r = mid - 1; } if(sum[r] <= d) ans = Math.min(ans, i - r); } return ans == n + 10 ? 0:ans; } }
时间: 2024-02-14 07:20:52 浏览: 93
这是一个 Java 语言编写的解决 LeetCode 题目的代码,具体来说,这个函数是用来解决“长度最小的子数组”这道题目的。函数接受两个参数,第一个参数是目标值 target,第二个参数是一个整数数组 nums。函数的返回值是一个整数,表示数组中存在的长度最小的子数组,使得子数组的和大于等于目标值 target。
相关问题
class Solution { public int[] twoSum(int[] nums, int target) { int n = nums.length; for(int i = 0;i < n;i++){ for(int j = i+1;j < n;j++){ if(nums[i]+nums[j]==target){ return new int[]{i,j}; } } } return new int[0]; } }
这段代码是一个经典的算法题——两数之和(Two Sum)。给定一个整数数组 nums 和一个目标值 target,找出数组中和为目标值的两个数的下标。
这段代码的解法是暴力枚举。我们从数组中的第一个元素开始,依次枚举每个元素,并用一个内层循环来查找与当前元素之和等于目标值的元素。如果找到了这样的元素,就直接返回它们的下标。
这种暴力枚举的解法时间复杂度为 O(n^2),不是最优解,但是是一种可行的解法,适用于数据规模较小的情况。如果数据规模较大,可以考虑使用哈希表等更高效的算法来解决。
import java.util.Scanner; import java.util.Arrays; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int[] nums=new int[n+1]; for(int i=0;i<n;i++){ nums[i]=sc.nextInt(); } int ans=0; Arrays.sort(nums); int temp=nums[0];//将数组第一个数保存下来 for(int i=0;i<n;i++){ nums[i]=nums[i+1]; } nums[n]=temp;//将第一个数的值赋值给最后一个数 // System.out.println(Arrays.toString(nums)); for(int i=1;i<=n;i++){ ans++; if(nums[i-1]!=nums[i]){ System.out.println(nums[i-1]+" "+ans); ans=0; } } } }优化一下这段代码,运行时间过长了
可以考虑使用快速排序算法来代替Arrays.sort()方法,因为快速排序算法的时间复杂度更低。另外,可以将循环中的i++改为i+=2,这样可以减少循环次数。最终代码如下:
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] nums=new int[n+1];
for(int i=1;i<=n;i++){
nums[i]=sc.nextInt();
}
int ans=;
quickSort(nums, 1, n);
int temp=nums[1];
for(int i=2;i<=n;i+=2){
nums[i-1]=nums[i];
nums[i]=temp;
if(nums[i-1]!=nums[i]){
System.out.println(nums[i-1]+" "+ans);
ans=;
}
ans++;
temp=nums[i+1];
}
}
public static void quickSort(int[] nums, int left, int right){
if(left>=right){
return;
}
int i=left, j=right, pivot=nums[left];
while(i<j){
while(i<j && nums[j]>=pivot){
j--;
}
nums[i]=nums[j];
while(i<j && nums[i]<=pivot){
i++;
}
nums[j]=nums[i];
}
nums[i]=pivot;
quickSort(nums, left, i-1);
quickSort(nums, i+1, right);
}
}
阅读全文