A+B_Problem解答
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A+B_Problem 解答
问题描述
在⼀个数组中找到两个⾓标元素,给定⼀个和值,返回
例如 arr = [11,2,3,5] ; 给定8; 返回2,3;
问题解答
常见的新⼿想法就是穷举两层循环进⾏遍历即可,那么这个题⽬就没什么出的意义了;这⾥给出⼀个复杂度是的解答⽅法,原理就是运⽤快排,在快排的过程中,每次准备插⼊元素的时候,进⾏⼀个⼆分查找对应的 [s - ], 找到了,程序终⽌; 知道排序完成结束查找,找不到合适的; 让 就返回-1;否则返回两个⾓标。
程序
#include <iostream>
#include<vector>
using namespace std;
int binFind(int arr[],int startIndex, int endIndex, int temp);
vector<int> solution(int arr[],size_t size, int s);
int main() {
int arr[] = {23,1,2,3,4,5,8,91,100};
vector<int> vec = solution(arr,9,101);
if(vec.size() == 1)
cout<<"Not Find"<<endl;
else
cout << vec[0] <<","<<vec[1]<<endl;
return 0;
}
int binFind(int arr[],int startIndex, int endIndex,int temp){
int midIndex;
while(startIndex <= endIndex){
midIndex = (startIndex + endIndex)/2;
if(temp == arr[midIndex])
return midIndex;
else if(temp < arr[midIndex])
endIndex = midIndex -1;
else
startIndex = midIndex +1;
}
return -1;
}
vector<int> solution(int arr[],size_t size, int s){
vector<int> result;
for(int i=0;i< size - 1; ++i){
int k = i+1;
int next = arr[k];
while(k >-1 && arr[k-1] > next){
arr[k] = arr[k-1];
k--;
}
arr[k] = next;
//上⾯部分完成快排,下⾯部分完成s = A+B 的寻找匹配
int ylable = binFind(arr,0,i,s-arr[i]);
if(!(ylable+1)){
result.push_back(i);
result.push_back(ylable);
return result;
}
}
result.push_back(-1);
return result;
}
后记
这个题⽬在知乎上偶然遇到,于是顺⼿解决了,贴上,起初⾃⼰使⽤python 实现的,后来回来了⽤C++重新写了遍,若有错误之处,稍后改正。
O (nlo (n ))g 2i +1a i x ,y x +y =s
python 实现
import numpy as np
def bFind(arr,start,end,temp):
while(start <= end):
mid = (int)((start + end)/2) if(temp == arr[mid]):
return mid
else:
if (temp > arr[mid]):
start = mid +1
else:
end = mid -1
return -1
def sumk(arr,s):
for i in range(len(arr)-1):
next1 = arr[i+1]
k = i;
while(i>-1 & arr[k] > next1): arr[k+1] = arr[k]
k = k-1
arr[k+1] = next1
ylable = s - arr[i]
temp = bFind(arr,0,i,ylable) if(temp != -1):
return i,temp
return 'not find'
arr =np.array([1,2,3,45,61,72]) print('结果:',sumk(arr,156))。