不重复打印排序数组中相加和为给定值的所有二元组和三元组
2018-03-06 16:27
375 查看
//不重复打印排序数组中相加和为给定值的所有二元组和三元组
public class GetArrNum{
//(1)获得排序数组中为给定值的二元组
public static void GetArrNum2(int []arr,int k)
{
if(arr==null||k<arr[0]||arr.length<2)
{
return;
}
//设置两个指针
int i=0;
int j=arr.length-1;
for(int w=0;w<arr.length;w++)
{
if((arr[i]+arr[j]==k)&&(i!=j))
{
System.out.println(arr[i]+" "+arr[j]);
j--;
}else if(arr[i]+arr[j]>k)
{
break;
}else{
i++;
}
}
System.out.println();
}
//(2)获得排序数组中为给定值的三元祖
public static void GetArrNum3(int[]arr,int k)
{
if(arr==null||k<arr[0]||arr.length<3)
{
return;
}
//设置两个指针
int i=0;
while(i!=arr.length-3)
{
for(int j=arr.length-1;j>=3;j--)
{
for(int w=i+1;w<arr.length-1;w++)
{
if(arr[i]+arr[j]+arr[w]==k&&((w<j))&&(i<j))
{
System.out.println(arr[i]+" "+arr[w]+" "+arr[j]);
}else if(arr[i]+arr[j]+arr[w]>k)
{
break;
}
}
}
i++;
}
System.out.println();
}
//(2)获得排序数组中为给定值的三元祖 方法二O(N*N)
public static void GetArrNum3T(int[] arr, int k) {
if (arr == null || arr.length < 3) {
return;
}
for (int i = 0; i < arr.length - 2; i++) {
if (i == 0 || arr[i] != arr[i - 1]) {
printRest(arr, i, i + 1, arr.length - 1, k - arr[i]);
}
}
}
public static void printRest(int[] arr, int f, int l, int r, int k) {
while (l < r) {
if (arr[l] + arr[r] < k) {
l++;
} else if (arr[l] + arr[r] > k) {
r--;
} else {
if (l == f + 1 || arr[l - 1] != arr[l]) {
System.out.println(arr[f] + "," + arr[l] + "," + arr[r]);
}
l++;
r--;
}
}
}
public static void main(String[]args)
{
int[]arr={-8,-4,-3,0,1,2,4,5,8,9};
int k=10;
GetArrNum2(arr,k);
GetArrNum3(arr,k);
GetArrNum3T(arr,k);
}
}
相关文章推荐
- 左神算法 不重复打印排序数组中相加和为给定值的所有二元组
- 不重复打印排序数组中相加和为给定值的所有三元组
- 不重复打印排序数组中相加和为给定值的所有二元三元组
- 笔试面试算法经典--打印数组中相加和为给定值的二元组及三元组(Java)
- 程序员面试题目总结--数组(一)【递归求数组所有元素和、用一个for循环打印出一个二维数组、用递归判断数组是否是递增、有序数组中删除重复元素】
- 打印出大小为n的数组(可能有重复元素)里所有可能的组合
- 给出一个数组 求任意个数的数相加的和等于给定数 输出所有满足条件的数
- 打印一个含有重复元素数组的所有子集
- 给定一个数组,n个数,打印所有可能的r位数的组合。例如{1,2,3,4}n=4,r=2.输出{1,2}{1,3}{1,4}{2,3}{2,4}{3,4}
- 给定一个数组,求出和为0的所有三元组
- 给定两个已经排序好的数组,找到两者所有元素中第 k 大的元素
- 给定一个排序数组,删除重复的位置,使每个元素只出现一次,并返回新的长度。
- 给定一组候选号码(C)(没有重复)和一个目标号码(T),找出C中所有候选号码和T相加的唯一组合。
- java 集合 从类似如下的文本文件中读取出所有的姓名,并打印出重复的 * 姓名和重复的次数,并按重复次数排序:
- 合法IP&窗口最大值数组&打印素数&递归逆序一个栈&栈排序另一个栈&MyString&寻找数组中出现的重复字符&数组中的重复数字&逆序打印链表&空格替换成%20
- leetcode-java.T015_3Sum---给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组
- 给定一个排序的链表,删除所有具有重复数字的节点,从原始列表中只留下不同的数字。
- http://www.dewen.net.cn/q/15749/PHP求数组值相加(可重复)等于某值的所有组合
- 9.10扩展性与存储限制(三)——若只有4KB内存可用,该如何打印数组中所有重复的元素
- (笔试中的题目)一个已经排序好的数组找到两个数字相加等于一个给定的数