左神算法 不重复打印排序数组中相加和为给定值的所有二元组
2018-02-05 14:52
441 查看
【题目】
给定一个排序的数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组。
如果从left = 0,right= 0开始,下一步的行动很难判断,如果right要保证大于left,肯定right先动,如果sum = arr[left] +arr[right] < k,应该right指针向右移动,但是如果sum>k呢,怎么移动,left向右移动吗,不合适。
所以让right在数组的末端,从left左边,right右边像中间扩。时间复杂度O(N);
注意判断不重复,使得left下标值不相同即可,因为k值是定的,left不同,right也不同了
给定一个排序的数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组。
如果从left = 0,right= 0开始,下一步的行动很难判断,如果right要保证大于left,肯定right先动,如果sum = arr[left] +arr[right] < k,应该right指针向右移动,但是如果sum>k呢,怎么移动,left向右移动吗,不合适。
所以让right在数组的末端,从left左边,right右边像中间扩。时间复杂度O(N);
注意判断不重复,使得left下标值不相同即可,因为k值是定的,left不同,right也不同了
public class Main { public static void main(String[] args) { int[] arr = { -8, -4, -3, 0, 1, 2, 4, 5, 8, 9 }; int k = 10; print(arr, k); } public static void print(int[] arr, int k){ if (arr == null || arr.length ==0){ return; } int left = 0, right = arr.length -1; int sum = 0; while (left < right){ sum = arr[left] + arr[right]; if (sum < k){ ++left; } else if (sum > k){ --right; } else { if (left == 0 || arr[left -1] != arr[left]){ System.out.print(arr[left] + "," +arr[right] + "\n"); } ++left; --right; } } } }
相关文章推荐
- 不重复打印排序数组中相加和为给定值的所有二元组和三元组
- 不重复打印排序数组中相加和为给定值的所有三元组
- 不重复打印排序数组中相加和为给定值的所有二元三元组
- 笔试面试算法经典--打印数组中相加和为给定值的二元组及三元组(Java)
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- (笔试中的题目)一个已经排序好的数组找到两个数字相加等于一个给定的数
- C++[算法]给定一个具有100个元素的数组,请对该数组随机赋值1-100,不能出现重复的值
- 左神算法 未排序正数组中累加和为给定值的最长子数组长度
- 左神算法 未排序数组中累加和为给定值的最长子数组系列问题
- 【LeetCode-面试算法经典-Java实现】【026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)】
- [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
- 算法练习——排序后的数组删除重复数字
- 每日一道算法题:微软面试题:在排序数组中,找出给定数字出现的次数
- 给出一个数组 求任意个数的数相加的和等于给定数 输出所有满足条件的数
- 给定一组候选号码(C)(没有重复)和一个目标号码(T),找出C中所有候选号码和T相加的唯一组合。
- 合法IP&窗口最大值数组&打印素数&递归逆序一个栈&栈排序另一个栈&MyString&寻找数组中出现的重复字符&数组中的重复数字&逆序打印链表&空格替换成%20
- 给定一个集合(字符数组),打印出它的所有子集
- 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]
- 每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
- java 集合 从类似如下的文本文件中读取出所有的姓名,并打印出重复的 * 姓名和重复的次数,并按重复次数排序: