Arrays 如何使用流(java.util.stream)处理嵌套for循环中的数组?
下面是我试图为上下文解决的问题:“给定一个整数数组nums和一个整数目标,返回两个数字的索引,使它们相加到目标 您可以假设每个输入都有一个解决方案,并且不能两次使用同一个元素 你可以按任何顺序返回答案。” 我想知道是否有可能使用流来解决这个问题。。。 这是我的密码:Arrays 如何使用流(java.util.stream)处理嵌套for循环中的数组?,arrays,for-loop,functional-programming,java-stream,Arrays,For Loop,Functional Programming,Java Stream,下面是我试图为上下文解决的问题:“给定一个整数数组nums和一个整数目标,返回两个数字的索引,使它们相加到目标 您可以假设每个输入都有一个解决方案,并且不能两次使用同一个元素 你可以按任何顺序返回答案。” 我想知道是否有可能使用流来解决这个问题。。。 这是我的密码: class Solution { public int[] twoSum(int[] nums, int target) { int num1=0; int num2=0; for
class Solution {
public int[] twoSum(int[] nums, int target) {
int num1=0;
int num2=0;
for(int i=0; i<nums.length; i++){
for(int j=0; j<nums.length; j++){
if(i==j)
j++;
if(j>=nums.length)
break;
if(nums[i]+nums[j]==target){
num1=i;
num2=j;
}//end of 3rd if
}//end of 2nd loop
}//end of 1st loop
int[] sol={num1,num2} ;
return sol;
}//end method
}
类解决方案{
公共int[]twoSum(int[]nums,int目标){
int num1=0;
int num2=0;
对于(inti=0;i,这里有几种可能性。
这是数据和目标
int[] nums = { 1, 10, 12, 3, 19, 33 };
int target = 43;
第一个基本上是嵌套的IntStream
- 它将
i=0的整数流到nums.length-1
- 对于
k=i+1到nums.长度
- 筛选与目标求和的第一个解决方案
- 然后它将索引保存在一个数组中并
- 返回包含解决方案的数组。或-1,-1
首先根据建议修改过滤解决方案
int[] result = IntStream.range(0, nums.length - 1)
.mapToObj(i -> IntStream.range(i + 1, nums.length)
.filter(k -> nums[i] + nums[k] == target)
.mapToObj(k -> new int[] { i, k }))
.flatMap(a -> a).findFirst()
.orElse(new int[] { -1, -1 });
此解决方案类似,只是它使用不同的方法生成索引
- 使用除法和余数运算符生成所有可能的索引对
- 如果索引相同,则添加条件以跳过测试
- 在这两种情况下,如果未能满足条件,则返回-1,-1的数组
对于给定的数组和目标,都打印
[1,5]
请记住,这些都不比简单的嵌套循环解决方案更有效。如果提供的数组仅由正数组成,则可以通过跳过已超过目标的单个值来提高循环解决方案的效率。一旦找到解决方案,就必须打破循环
就您最初的解决方案而言,它可以改进如下:
- 从
i=0到nums.length-1开始外部循环
- 内部循环从
j=i+1变为nums.length
。因此i和j永远不会是相同的值
- 一旦找到第一个解决方案,就打破循环
类解决方案{
公共int[]twoSum(int[]nums,int目标){
int结果[]={-1,-1};
外部:用于(int i=0;i
如果一个数字在数组中出现两次,我可以同时使用两次吗?OP说不能使用同一个元素两次。但我认为数组中两个不同位置的相同值将是两个不同的元素。当然,如果目标是奇数,则与此无关。好主意。我没有考虑到这一点。我会做出更改。t汉克斯回答说:“我真的忍不住了:)
[1,5]
class Solution {
public int[] twoSum(int[] nums, int target) {
int result[] = { -1, -1 };
outer: for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
result[0] = i;
result[1] = j;
break outer;
}
}
}
return result;
}
}