《算法导论》习题2.3-7

代码如下:

 1 public class MergeSort {
 2
 3     public static void sort(int [] A,int p, int r)
 4     {
 5         if(p<r)
 6         {
 7             int q = (int) Math.floor( (p+r)/2 );
 8             sort(A,p,q);
 9             sort(A,q+1,r);
10             merge(A,p,q,r);
11         }
12         return ;
13
14     }
15     public static void merge(int [] A, int p, int q, int r)
16     {
17         int n1 = q-p+1;
18         int n2 = r-q;
19         int [] L = new int[n1];
20         int [] R = new int[n2];
21         for(int i=0; i<n1; i++)
22           L[i] = A[p+i];
23         for(int i=0; i<n2;i++)
24             R[i]=A[q+i+1];
25
26         int i=0;
27         int j=0;
28         int counter = p;
29         while(i<L.length && j<R.length)
30         {
31             if(L[i]<=R[j])
32             {
33                 A[counter]=L[i];
34                 i++;
35             }
36             else
37             {
38                 A[counter]=R[j];
39                 j++;
40             }
41             counter++;
42         }
43         if(i==L.length)
44         {
45             for(int k=j;k<R.length;k++)
46                 A[counter++] = R[k];
47         }
48         else
49         {
50             for(int k=i;k<L.length;k++)
51                 A[counter++] = L[k];
52         }
53     }
54 }
 1 public class SumTwoEqual {
 2
 3     /**
 4      * @param args
 5      */
 6     public static boolean TestExists(int A[],int X)
 7     {
 8         MergeSort.sort(A, 0, A.length - 1 );
 9         int i = 0;
10         int j = A.length-1;
11         while(i<j)
12         {
13             if(A[i]+A[j]==X)
14                 return true;
15             else if(A[i]+A[j] > X)
16                 j--;
17             else
18                 i++;
19         }
20         return false;
21     }
22
23     public static void main(String[] args) {
24         int A[] = {1,2,5,7,9,14,25,35,13,15};
25         boolean a = TestExists(A,22);
26         System.out.println(a);
27     }
28 }
算法思想很简单,就是先排序,然后从两边往中间找。

 
时间: 2025-01-05 04:42:54

《算法导论》习题2.3-7的相关文章

算法导论习题 通用汇点

来自习题22.1-6 给出O(V)时间算法判断有向图G是否存在一个通用汇点(universal sink).通用汇点指的是入度为|V|-1,出度为0的节点. 思路: 考虑图的邻接矩阵A,假设i为通用汇点,则对于0<=j<n,有A[i][j]=0,且对于所有0<=k<n and k != i,有A[k][i] = 1,注意这里k!=i 相当于在子矩阵A[0..i][0..i]的右边和下边造了一个围墙,最下边全是0,最右边除了右下角外全是1 那么可以令游标从矩阵左上角开始,遇1向下,逢

从头看算法导论 习题2.3-7 深入分析

题目:请给出一个时间复杂度为nlogn的算法,使之能够在给定一个由n个整数的构成的整合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素. 算法思想:1.先运用合并排序进行排序 O(nlgn),2.然后运用二分查找法寻找y,y = x - a[i],算法的时间复杂度小于nlogn,所以总的时间复杂度还是nlogn. 批注:该思想,不是最好的(从简洁.时间复杂度上得到结论),不喜勿喷. 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h

算法导论习题4-5:芯片检测

习题4-5 3rd edition (4-6 2nd edition) 解法1: 将芯片两两配对,对于后三种情况(至少其中一个是坏的),可以直接将该对芯片丢弃,这样丢弃的好的一定不会超过坏的. 剩下的都是第一种情况,以及可能剩下的单个未配对的. 如果数量为偶数,即没有未配对的,那么"好好"对数一定超过"坏坏"对数,所以每对里面丢弃一个即可. 如果数量为奇数,则保留那个未配对的,并且每对丢掉一个. 解法2: 优点是只需单向检测即可.其实解法1稍作修改也可只用到单向检测

算法导论学习笔记(3)-习题2.3-7-排序+二分

question(题意): Describe a O(n lg(n))-time algorithm that, given a set S of n integers and another integer x, determines whether or not there exist two elements in S whose sum is exactly x. 设计一个O(n lg(n))时间复杂度的算法,给定一个n个数字的集合,和一个数字x, 问,是否能在这个集合中找到两个数字,他

算法导论2:几个习题 2016.1.2

一.在归并排序中对小数组采用插入排序(放在上一篇里了): 二.冒泡排序 冒泡排序效率几乎是所有排序里最低的,但却很流行,就是因为它的变成复杂度也是最低的.大多数时候,效率还不及插入排序,其实冒泡排序.插入排序.选择排序基本上效果是差不多的(这个效果不是功能..功能上讲肯定差不多啊都是排序),只是过程略有区别.既然写到这里,就自己总结一下三者吧. 1.插入排序——摸扑克牌的过程 假定前一个是有序的,把第二个插进它应当在的位置,那么前两个就是有序的了,把第三个插进它应当在的位置,那么前三个就是有序的

算法导论_第二章(1)

年前的时候去逛书店,久仰算法导论这本书的大名看见后也就买了下来.回家看了一段时间,发现看书的进度真的是极慢,书里的课后题很多,那些不会的问题也是通过网上搜别人的答案才得以解决的.所以,我就想把我看这本书的心得连带课后的解答分享给大家.同时也是给我坚持把算法导论这本书看完的一个动力 ^_^ 因为本书的第一章相当于一个导论就直接跳过了,那么,从第二章开始! 第二章主要介绍了插入排序和归并排序: 所谓的插入排序就像是一局扑克刚开始时的摸牌阶段,你对手中的扑克所做的整理排序一样.开始时,我们的左手为空并

算法导论学习笔记 (页码:9 ~ 16)

前面算法在生活中不谈,算法的重要性不谈,直接说算法. 第2章 算法基础 2.1 插入排序 书中主要介绍了插入排序的思想,即对于数组A[0 ~ N - 1],长度为N.那么,升序的插入排序的过程即是从A[1]开始,先和A[0]比较,如果比A[0]小,那么将A[0]的元素顺序后移放置在A[1]中,将原本A[1]的元素插入在A[0]的位置上,同理再拿A[5]举例,如果比A[4]小,那么A[4]后移,继续比较A[3],如果还是小,A[3]后移,直到找到合适的位置进行插入,原书中提供的伪代码,我这里提供对

算法导论5:基数排序 2016.1.5

今天的这个比较神奇,是一个线性复杂度的排序算法O(n),算法导论在这一部分先证明了比较排序的复杂度下界是nlgn,所以基数排序不是基于比较的排序. 其实这种比较方法我们应该都接触过.假设输入的数都是三位以下的数(当然其他位数也可以,类比一下,这里就假设是三位数.两位数.一位数),那么只需要大致3n的复杂度就可以排好序.过程是这样: 先设置辅助空间t[0..9][n] 然后扫第一遍n个数,个位是几就放在t[几]那一行.然后扫一遍t数组,按顺序放回原数组中 然后扫第二遍n个数,十位是几就放在t[几]

《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解

原文:http://www.cnblogs.com/Anker/archive/2013/05/04/3059070.html 1.前言 前段时间忙着搞毕业论文,看书效率不高,导致博客一个多月没有更新了.前段时间真是有些堕落啊,混日子的感觉,很少不爽.今天开始继续看算法导论.今天继续学习动态规划和贪心算法.首先简单的介绍一下动态规划与贪心算法的各自特点及其区别.然后针对0-1背包问题进行讨论.最后给出一个简单的测试例子,联系动态规划实现0-1背包问题. 2.动态规划与贪心算法 关于动态规划的总结

算法导论第九章中位数和顺序统计量(选择问题)

本章如果要归结成一个问题的话,可以归结为选择问题,比如要从一堆数中选择最大的数,或最小的数,或第几小/大的数等, 这样的问题看似很简单,似乎没有什么可研究的必要,因为我们已经知道了排序算法,运用排序+索引的方式不就轻松搞定了?但细想,排序所带来的时间复杂度是不是让这个问题无形之中变得糟糕.那算法研究不就是要尽可能避免一个问题高复杂度地解决,让那些不敢肯定有无最优解的问题变得不再怀疑,这也是算法研究者所追求的一种极致哲学.既然排序让这个问题解决的性能无法确定,那我们就抛开排序,独立研究问题本身,看