和为S的两个数字

输入一个递增排序的数组和一个数字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 }

 

 

和为S的连续正数序列

小明很喜欢数学,有一天他在做数学作业时,要求计算出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 }

 

posted on 2019-06-14 17:45  Sempron2800+  阅读(137)  评论(0编辑  收藏  举报