输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
1 # -*- coding:utf-8 -*- 2 class Solution: 3 def FindNumbersWithSum(self, array, tsum): 4 n = len(array) 5 i,j = 0,n-1 6 while i<j: 7 cur = array[i] + array[j] 8 if cur == tsum: 9 return [array[i],array[j]] 10 if cur < tsum: 11 i += 1 12 else: 13 j -= 1 14 return [] 15 # write code here
Java版本代码,leetcode地址:
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 int n = nums.length; 4 int i = 0; 5 int j = n-1; 6 while(i < j) { 7 int cur = nums[i] + nums[j]; 8 if(cur < target) { 9 i++; 10 }else if(cur > target) { 11 j--; 12 }else { 13 return new int[] {nums[i],nums[j]}; 14 } 15 } 16 return new int[0]; 17 } 18 }
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
1 # -*- coding:utf-8 -*- 2 class Solution: 3 def FindContinuousSequence(self, tsum): 4 start,end,cursum = 1,2,3 5 result = [] 6 while end < tsum: 7 if cursum > tsum: 8 cursum -= start 9 start += 1 10 elif cursum < tsum: 11 end += 1 12 cursum += end 13 else: 14 l = [] 15 for i in range(start,end+1): 16 l.append(i) 17 result.append(l) 18 cursum -= start 19 start += 1 20 end += 1 21 cursum += end 22 return result 23 # write code here
Java版代码,leetcode地址:
1 class Solution { 2 public int[][] findContinuousSequence(int target) { 3 int start = 1;// 第一个数字1 4 int end = 2;// 第二个数字2 5 int cursum = 3;// 最小的两个数字1+2之和 6 List<int[]> result = new ArrayList<int[]>(); 7 while (end < target) { 8 if (cursum > target) {// 和大于目标,左边界向右移动,缩小区间范围 9 cursum -= start; 10 start++; 11 } else if (cursum < target) {// 和小于目标,右边界向右移动,增大区间范围 12 end++; 13 cursum += end; 14 } else {// 相等,找到满足的一组数据 15 int[] l = new int[end - start + 1]; 16 for (int i = 0; i < end - start + 1; i++) { 17 l[i] = i + start; 18 } 19 result.add(l);// 将一组满足的数据加入结果集 20 21 // 向右平移 22 cursum -= start; 23 start++; 24 end++; 25 cursum += end; 26 } 27 } 28 return result.toArray(new int[result.size()][]); 29 } 30 }