【100题】第十四题(数组中找两个数使其和等于输入数)

一,题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

二,题目难点在于时间复杂度控制在O(n)

三,方法一

        1,分别从数组前,数组后向中间查找。直到前后相遇!!

        2,当前得到currentSum>sum说明:大的数太大(数组递增,后面的数太大)。应该将指向最后的标记向前挪动

        3,当前得到currentSum<sum说明:大的数太小(数组递增,前面的数太小)。应该将指向最后的标记向后挪动 

        4,当前得到currentSum=sum说明:找到答案


#include <iostream.h>
bool FindTwoNumbersWithSum(int data[],unsigned int length,int sum, int& num1,int& num2)
{                            //num1,num2采用的是地址,如果方法内改变则改变的是调用实参的值  
    bool found = false;
    if(length < 1)
        return found;
   
    int begin = 0;
    int end = length - 1;
   
    while(end > begin)
    {
        long curSum = data[begin] + data[end];
       
        if(curSum == sum)
        {
            num1 = data[begin];
            num2 = data[end];
            found = true;
            break;
        }
        else if(curSum > sum)
            end--;
        else
            begin++;
    }
    return found;
}
int main()
{
    int x,y;
    int a[6]={1,2,4,7,11,15};
    if(FindTwoNumbersWithSum(a,6,15,x,y) )
    {
        cout<<x<<endl<<y<<endl;
    }
    return 0;
}
方法二:假如

1,数组为:a={1、 2、  4、7、11、15 }

2,输入sum=15

3,用15减去a数组中每一个元素得到

         b={14、13、11、8、4、0 }    

4,a数组向右扫描

      b数组向左扫描

5,如果a出现了和b一样的数,稍加判断,就能找出这俩个数来了。



  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以定义一个函,接收一个数组和一个数作为参,然后在函内部对数组进行排序,再使用循环遍历数组,查数组中的位置。如果到了,就返回该数组中的下标加1,即为该数组中的第几个元素;如果没有到,就返回“无此!”。 函的代码如下: ```python def find_num(arr, num): arr.sort(reverse=True) # 对数组进行排序,从大到小 for i in range(len(arr)): if arr[i] == num: return i + 1 # 到了,返回该数组中的下标加1 return "无此!" # 没有到,返回“无此!” ``` 使用示例: ```python arr = [10, 8, 6, 4, 2, 9, 7, 5, 3, 1, 11, 13, 15, 12, 14] num = 7 print(find_num(arr, num)) # 输出:7 ``` 注意:这里假设输入数组已经按照从大到小的顺序排好了序。如果没有排好序,可以在函内部先进行排序。 ### 回答2: 首先,我们可以定义一个函,参数组和目标。接下来,我们使用循环遍历数组中的元素,然后判断目标与当前元素是否相等。若相等,则返回当前元素的索引加一即可。若循环结束仍未到相等的元素,则输出"无此"。 以下是具体步骤: 1. 定义一个函,参数组arr和目标target。 2. 使用循环遍历数组arr中的元素,从最大值开始,判断元素是否等于目标target。 3. 若等于,则返回当前元素的索引加一。 4. 若循环结束仍未到相等的元素,则输出"无此"。 5. 编写代码测试函的功能。 代码实现如下: ```python def find_element(arr, target): for i in range(len(arr), 0, -1): if arr[i-1] == target: return i return "无此!" arr = [15, 12, 10, 8, 6, 5, 4, 3, 2, 1, -1, -3, -5, -7, -9] target = int(input("请输入个数:")) result = find_element(arr, target) print(result) ``` 假设输入为12,则输出结果为2,即目标12在数组中的第2个元素。如果输入为0,则输出结果为"无此!",即目标不在数组中。 ### 回答3: 可以使用二分查算法来解决这个问。首先,我们需要将给定的15个数按从大到小的顺序存入一个数组中。然后,定义一个函,该函接受个参:要查数组。 在函中,我们使用二分查算法来查给定的。具体步骤如下: 1. 设置左边界为0,右边界为数组长度减1。 2. 当左边界小于等于右边界时,重复以下步骤: a. 计算中间位置的索引,即(left + right) / 2。 b. 如果中间位置的等于要查,则返回该中间位置索引值加1。 c. 如果中间位置的大于要查,则将右边界更新为中间位置减1。 d. 如果中间位置的小于要查,则将左边界更新为中间位置加1。 3. 如果左边界大于右边界,则说明要查不在数组中,返回“无此!”。 以下是完成上述步骤的函的示例代码: ```python def find_number(num, arr): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == num: return mid + 1 elif arr[mid] > num: right = mid - 1 else: left = mid + 1 return "无此!" ``` 然后,我们可以在主程序中使用该函来查给定的数组中的位置。示例代码如下: ```python arr = [20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6] num = int(input("请输入个数:")) position = find_number(num, arr) print(position) ``` 通过上述代码,我们就可以出给定的数组中的位置,或者输出“无此!”。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值