[百度]在由N个正整数的集合S中,找出最大元素C,满足C=A + B

【题目】

在由N个正整数的集合S中,找出最大元素C,满足C=A + B 其中A,B都是集合S中元素,请给出算法描述,代码与时间复杂度分析。

【分析】

1,对集合S进行排序(快排),从小到大排序

2,让C指向集合最后一个元素(最大元素)

3,让i指向S中第一个元素,让j指向C的前一个元素

4,如果,A[i]+A[j]==C则return C;

5,如果if(A[i]+A[j]<C)则i++;

6,如果if(A[i]+A[j]>C)则j--;

7,直道i>=j依然没有找到符合条件的元素,则C在S中向前移动一位,跳至步骤3

【代码】

/*********************************
*   日期:2015-01-29
*   作者:SJF0115
*   题目: 在由N个正整数的集合S中,找出最大元素C,满足C=A+B,其中A,B都是集合S中的元素
*   来源:百度
*   博客:
**********************************/
#include <iostream>
#include <algorithm>
using namespace std;

int FindSum(int A[],int n){
    // 排序
    sort(A,A+n);
    int left,right,sum;
    // i = C
    for(int i = n - 1;i >= 2;--i){
        left = 0,right = i - 1;
        // 判断是否有A + B = i
        while(left < right){
            sum = A[left] + A[right];
            if(sum == A[i]){
                return A[i];
            }//if
            else if(sum > A[i]){
                --right;
            }
            else{
                ++left;
            }
        }//while
    }//for
    return -1;
}

int main(){
    int A[] = {5,7,3,0,9,11,8,13,100};
    int n = 9;
    cout<<FindSum(A,n)<<endl;;
    return 0;
}

讨论:[百度]在由N个正整数的集合S中,找出最大元素C,满足C=A + B

时间: 2024-09-29 11:29:54

[百度]在由N个正整数的集合S中,找出最大元素C,满足C=A + B的相关文章

在由N个元素构成的集合S中,找出最小元素C,满足C=A-B,其中A,B是都集合S中的元素,没找到则返回-1

package bianchengti; /* * 在由N个元素构成的集合S中,找出最小元素C,满足C=A-B, * 其中A,B是都集合S中的元素,没找到则返回-1 */ public class findMinValue { //快速排序 public static void sort(int a[], int low, int hight) { if (low > hight) { return; } int i, j, key; i = low; j = hight; key = a[i]

一句话的代码,从集合中找出第一个重复字符的方法javascript版。

有的时候需求是这样的: 找出集合中第一个重复的字符所在的位置,刚才看了园内某自许为算法的代码,感觉非常之啰嗦故写了以下代码! 本人对神马算法之类的完全不懂,但那些伪算法家们也别出来装蒜.一句话:不要欺负俺没文化好不好! 别的不说看代码: Array.prototype.searchFirstNotRepeat = function () { var curArr = this, val; while (-1 == (val = curArr.indexOf(curArr.shift())));

快速从2个List集合中找出相同/不同元素

最近刚好涉及到从2个不同集合中找出不同的元素的需求,以下为测试代码 1.利用 apache collection 工具内中的方法,附上坐标 <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> c

在由N个正整数的集合S中,找出最大元素M,满足M=A + B,其中A,B都是集合S中元素

思路:先对集合排序,时间复杂度nlogn,再把M从最大值开始遍历,A和B分别取小于M的最小值和最大值,测试A+B是否等于M,如果小则A右移,如果大则B左移.总的时间负责度为n*n int find(int S[], int n){ sort(S, S + n); for(int i = n - 1; i >=2; --i){ int left = 0, right = i - 1; while(left < right){ if(S[left] + S[right] == S[i]) retu

数论 - 整除问题 --- 整数集合中找出3的最大倍数

Mean: 题目描述:给一个包含非负整数的数组(长度为n),找出由这些数字组成的最大的3的倍数,没有的话则输出impossible. analyse: 首先想到的就是直接暴力,这是最蠢的方法,数据一大的话,必会TLE. 直接用蛮力的话,生成所有的组合,为 2^n个,对每个数字再进行比较判断,需要 O(n)的时间,因为n可能会比较大,需要每个位的比较.总的时间复杂度为O(n * 2^n). 那么到底要怎么做呢? 首先我们来了解几个数学知识: 1)一个数n对m取余的余数为a1,b为n的每一位数字的和

集合遍历过程iterator, 添加删除元素报异常

list  set  遍历过程中添加或者删除元素,报异常. 使用iterator 也会报异常 ConcurrentModificationException remove只能用迭代器的remove,而不能用集合的remove方法,iterator的remove会维护索引的一致性 iterator it = list.iterator(); while(it.hasnext(0){ obj = it.next(); it.remove(); } 用java.util.concurrent中的类代替

集合 java中的迭代器

今天学习了 集合,但是感觉对于迭代器不是 很明白,所以研究了一下! 在 JDK中 Collection作为集合的顶级容器, 她实现了Java.lang.Iterable  接口! Iterable:  可迭代的, 想使用迭代功能的容器必须实现这个顶级接口,中的 iterator() 方法. Iterator:迭代器. 每个容器的内部都有不同的迭代器实现.抽取出她们的共性,我们抽取出 Iterator 接口. 我们查看源码 Iterator: public interface Iterator<E

《找出1到正整数N中出现1的次数》

编程思想:依次求出正整数每个位数上出现1的次数,累加即可得到最后想要的结果:而每一位上出现1的个数与和它相邻的其它位数上的数字有关系(以此位置上的数为对称轴,其左边的所有数字作为其最高位,其右边的数字作为其最低位:当然若此位置已处于最低位或最高位,那么它对应的最低位或最高位置0),与它们有一个可求出1的固定的关系式(一个数各个位置上的数分离后,它们都对应着各个位置的基准,例如个位上的数对应的基准为1,以此类推即可),即若此位置上的数字为0,则在此位置上出现1的个数为最高位乘以基准:若为1,则等于

找出一段连续的正整数序列中重复(或缺失)的那个数

有这样一个简单的问题:给定n-m+2(或n-m)个正整数组成的乱序序列,其元素是m到n(n>m>=1)中的互不相同的正整数,有且只有一个是重复(或缺失)的.如何找到那个数?(这里假定缺失的数不是n或m) 由Ivony提出的异或算法想到的. 1.由于[m,n]这段闭区间的异或算法暂时没有想到,所以就用[1,m-1]^[1,n]来间接得出[m,n]这段闭区间的异或. 2.求出待求数组的异或,将此结果再与上面[m,n]的异或结果再次异或,即可得到那唯一的一个重复数(或缺失的那个数) 1 using