zoukankan      html  css  js  c++  java
  • A+B_Problem 解答

    问题描述

    在一个数组中找到两个角标元素,给定一个和值,返回
    例如 arr = [11,2,3,5] ; 给定8; 返回2,3;

    问题解答

    常见的新手想法就是穷举两层循环进行遍历即可,那么这个题目就没什么出的意义了;这里给出一个复杂度是O(nlog2(n))的解答方法,原理就是运用快排,在快排的过程中,每次准备插入i+1元素的时候,进行一个二分查找对应的 [s - ai], 找到了,程序终止; 知道排序完成结束查找,找不到合适的x,y; 让 x+y=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++重新写了遍,若有错误之处,稍后改正。

    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))
    
  • 相关阅读:
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    64位WIN7系统 下 搭建Android开发环境
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
  • 原文地址:https://www.cnblogs.com/actanble/p/6713438.html
Copyright © 2011-2022 走看看