迅速找出数组a中是否存在相加后等于整数x的两个元素

public class QuickSearch {
  
    public static int getMiddle(List<Integer> list, int low, int high) {
          Integer temp = list.get(high);   
            while (low < high) { 
                while (low < high && list.get(low) < temp) { 
                    low++; 
                } 
                list.set(high, list.get(low));
                while (low < high && list.get(high) > temp) { 
                    high--; 
                } 
                list.set(low, list.get(high));
                if (list.get(high) == temp) {
                    break;
                }
            } 
            list.set(high, temp);
        return low;                  
    }
     
    //先定位3个点
    public static void quickSearch(List<Integer> list, int low, int high) { 
        if (low < high) { 
            int target = getMiddle(list, low, high); 
            if (target<2) {
                return;
            }
            int middle = getMiddle(list, low, target-1);
            int lwoMiddle = 0;
            if (middle>0) {
                lwoMiddle = getMiddle(list, low, middle-1);
            }
            int highMiddle = target-1;
            if(middle+1 != target){
                highMiddle = getMiddle(list, middle+1, target-1);
            }
            int lowLow = low;
            int lowHigh = target-1;
            int highLow = target+1;
            int highHigh = high;
            numSearch(list,target,lwoMiddle,highMiddle,lowLow,lowHigh,highLow,highHigh);
        } 
    } 
     
    //找出匹配的相加项
    public static void numSearch(List<Integer> list,int target,int lwoMiddle,int highMiddle,int lowLow, int lowHigh,int highLow,int highHigh){
        Integer targetNum = list.get(target);
        Integer lwoMiddleNum = list.get(lwoMiddle);
        Integer highMiddleNum = list.get(highMiddle);
        boolean flag = true;
        while(flag){
            if (lwoMiddleNum + highMiddleNum > targetNum) {
                recursionSearch(list,lwoMiddle+1,lowHigh,highLow,highMiddle-1,target);
                recursionSearch(list,lowLow,lwoMiddle-1,highMiddle+1,highHigh,target);
                recursionSearch(list,lowLow,lwoMiddle-1,highLow,highMiddle-1,target);
            }else if (lwoMiddleNum + highMiddleNum < targetNum) {
                recursionSearch(list,lwoMiddle+1,lowHigh,highMiddle+1,highHigh,target);
            } else{
                System.out.println(lwoMiddleNum+" + "+highMiddleNum+" = "+targetNum);
                flag = false;
            }
        }
    }
     
    public static void recursionSearch(List<Integer> list, int lowLow, int lowHigh,int highLow,int highHigh,int target){
        int lwoMiddle = -1;
        int highMiddle = -1;
        if (lowLow < lowHigh) {
            lwoMiddle = getMiddle(list, lowLow, lowHigh);   
        }
        if (highLow < highHigh) { 
            highMiddle = getMiddle(list, highLow, highHigh);
        }
        if (lwoMiddle == -1 || highMiddle == -1 ) {
            return;
        }
        numSearch(list,target,lwoMiddle,highMiddle, lowLow, lowHigh, highLow, highHigh);
    }
     
     
    public static void quick(List<Integer> list,int search) { 
        list.add(search);
        if (list.size() > 0) {  
            quickSearch(list, 0, list.size() - 1); 
        } 
    } 
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(14);
        list.add(3);
        list.add(12);
        list.add(1);
        list.add(9);
        list.add(7);
        list.add(11);
        list.add(10);
        list.add(5);
        list.add(6);
        quick(list, 10);
    }
}

复杂度:N+(N/2)lg(N/2)。

时间: 2024-10-10 03:38:54

迅速找出数组a中是否存在相加后等于整数x的两个元素的相关文章

封装函数,找出数组 arr 中重复出现过的元素.

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><script> //封装函数,找出数组 arr 中重复出现过的元素. //示例: console.log(duplicates( [1, 2, 4, 4, 3, 3, 1,

找出数组a[]中符合a[i]+a[j]=K的数对

1.问题描述 在一个整数数组中,元素都为整数,没有重复数.设计一个算法找出满足两个数的和等于k值得数对.例如a[]={1,3,8,6,4}中两个数的和为7的数对为(1,6)和(3,4). 2. 解决方案 2.1 暴力法 首先先到的可能就是暴力法,暴力没举出所有的数对然后再判对他们的和是否为K,但这种方法的时间复杂度为O(n^2),效率比较低,一般不可取.代码也就不写了.. 2.2 二分法 先对数组进行排序,然后使用二分查找算法,使用两个指针分片指向第一个和最后一个元素,然后从两端同时向中间遍历.

经典算法学习——快速找出数组中两个数字,相加等于某特定值

这个算法题的描述如下:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值.目前我假设数组中的都是各不相等的整数.这道题是我在一次面试中被问到的,由于各种原因,我没回答上来,十分尴尬.其实这道题十分简单,我们使用相对巧妙的方法来实现下.注意不使用两层循环的元素遍历.示例代码上传至:https://github.com/chenyufeng1991/SumTo100 . 算法描述如下: (0)首先对原数组进行排序,成为递增数组: (1)对排序后的数组头部i [0]和数组尾部j [n-1]

442. 找出数组中重复的元素 Find All Duplicates in an ArrayGiven an array of integers

Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements that appear twice in this array. Could you do it without extra space and in O(n) runtime? Example: Input: [4,3,2,7,

找出数组中出现次数超过一半的元素

题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int half_number(int a[], int n) { if( a == NULL || n <= 0 ) return -1; int i, candidate; int times = 0; for( i=0; i<n; i++ ) { if( times == 0 ) { candidate

算法之找出数组中出现次数大于n/m的元素

最经典的题目莫过于是: 在一个数组中找出出现次数超过n/2的元素?更进一步的,找出数组中出现次数大于n/3的所有元素? 注:这里有一个很重要的事实,那就是出现次数大于n/m的元素的个数至多为(m-1)个,比如出现次数大于n/3的至多只有两个. 关于这一类题目的解题思路,可以先讲一个游戏 称作 "俄罗斯方块".这里的规则是每一行的元素要完全不一样,一样的元素则总是在同一列,如果最下面的行已经被填满,那么消除最下面的行. 例如在数组 A = {7,3,3,7,4,3,4,7,3,4,3,4

找出数组中唯一的重复元素

[问题] 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次. 每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助存储空间,能否设计一个算法实现? [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> /*根据异或法的计算方式,每两个相异的数执行异或运算之后,结果为1: 每两个相同的数异或之后,结果为0,任何数与0异或,结果仍为自身. 所以数组a[N]

找出数组中唯一重复的数(转)

题目: 数组a[N],1至N-1这N-1个数存放在a[N]中,其中某个数重复一次.写一个函数,找出被重复的数字. 方法一:异或法. 数组a[N]中的N个数异或结果与1至N-1异或的结果再做异或,得到的值即为所求. 设重复数为A,其余N-2个数异或结果为B. N个数异或结果为A^A^B 1至N-1异或结果为A^B 由于异或满足交换律和结合律,且X^X = 0  0^X = X; 则有 (A^B)^(A^A^B)=A^B^B=A 代码: #include <stdio.h> #include &l

1142: 零起点学算法49——找出数组中最大元素的位置(下标值)

1142: 零起点学算法49--找出数组中最大元素的位置(下标值) Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1937  Accepted: 977[Submit][Status][Web Board] Description 找出数组中最大的元素的下标. Input 多组测试,每组先输入一个不大于10的整数n 然后是n个整数 Output 输出这n个整数中最大的元素及下标值 Sample I