2.分治算法研究-搜索数组中的最大连续子集和 2014-3-11 11:37 阅读(16)

//分治算法研究
var cc=console
function find_max_crossing_subarray(A,low,mid,high){
    var max_left=mid,max_right=mid
    var left_sum=0
    var sum=0
    for(var i=mid;i>=low;i--){
        sum=sum+A[i]
        if(sum>left_sum){
            left_sum=sum
            max_left=i
        }
    }
    var right_sum=0
    var sum=0
    for(var i=mid+1;i<=high;i++){
        sum=sum+A[i]
        if(sum>right_sum){
            right_sum=sum
            max_right=i
        }
    }
    return [max_left,max_right,left_sum+right_sum]
}
//搜索跨越中点的最大连续子集和
var arr=[13,-3,-2,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
//var re=find_max_crossing_subarray(arr,0,8,arr.length-1)
//cc.log(re)//=>18,20,-7,12

function find_maximum_subarray(A,low,high){
    if(high==low){
        return [low,high,A[low]]
    }else{
        var mid=(low+high)>>1

/*[left_low,left_high,left_sum]*/
        var left=find_maximum_subarray(A,low,mid)
        /*[right_low,right_high,right_sum]*/
        var right=find_maximum_subarray(A,mid+1,high)
        /*[cross_low,cross_high,cross_sum]*/
        var cross=find_max_crossing_subarray(A,low,mid,high)

if(left[2]>=right[2]&&left[2]>=cross[2]){
            return left
        }else if(right[2]>=left[2]&&right[2]>=cross[2]){
            return right
        }else if(cross[2]>=left[2]&&cross[2]>=right[2]){
            return cross
        }
    }
}
//搜索数组中的最大连续 子集和
var re2=find_maximum_subarray(arr,0,arr.length-1)
cc.log(re2)//=>18,20,-7,12  [7,10,42]

时间: 2024-07-30 14:07:39

2.分治算法研究-搜索数组中的最大连续子集和 2014-3-11 11:37 阅读(16)的相关文章

3.分治法研究-搜索数组中的最长连续递增子集

//分治算法研究 搜索数组中的最长连续递增子集var cc=consolefunction find_max_crossing_lenarray(A,low,mid,high){    var max_left=mid,max_right=mid    var left_sum=1    var sum=0    for(var i=mid;i>low;i--){        sum=A[i]-A[i-1]        if(sum==1){            left_sum++   

(算法)求数组中出现频率最高的数

不准备实现算法先,根据21题和前辈的经验,这道题的真正考核点不在于解决这个问题,而在于拿到这个问题以后题的问题. 正常的一个做法,一次扫描然后用HASHMAP进行一个统计,然后再扫描一次HASHMAP获得频率最高的数.时间是O(N)空间也是O(N). 还有一种是做排序,然后扫描一次根据下标计算可以得到频率最高的数(可以避免空间消耗?). (不知道是否还有别的做法?) 据说我们应该先问这个数组是否已经排序?(想得美) 然后是否已经知道这个数的大概出现频率(比如说超过一半) 是否可以用额外空间?是否

[经典算法题]寻找数组中第K大的数的方法总结

[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家. 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题.

数组中 最大和 的子数组

题目: 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n). 例如: 输入的数组为1, -2, 3, 10, -4, 7, 2, -5,最大和的连续子数组为3, 10, -4, 7, 2,其最大和为18. 背景: 本题最初为2005年浙江大学计算机系考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都把本题当作面试题. 由于本题在网络中广为流传,本题也顺利成为2006年程序员面试题中经典中的经典. 分析: 如果不考

分治算法——最大子数组

表示很久没有接触算法了,好多东西真心要一点点拾掇起来,为了找份好工作,我也是蛮拼的了. 好吧,下来说说分治算法,因为在leetcode上刚好碰到这么个问题,想到要用分治做,但是一时又不清楚具体步骤.于是抱起<算法导论>啃起来.刚好上面的例子也是这个算法,就研读了一下. 假定,我们要寻找子数组A[low...high]的最大字数组,使用分治算法,其结果必定是以下三种情况中的一个: 1.完全位于子数组A[low...mid]中,因此low <= i <= j <= mid 2.完

写一个查找算法找出数组中相同的元素

1 import java.util.ArrayList; 2 3 public class Test { 4 5 // 原始数据data.假设data数组中的数据元素已经按照某种顺序排好. 6 // 但是,该数组中的数据元素重复出现. 7 // 我们的目的是查找.解析data数组中重复出现的某元素. 8 // 比如,在这个data数组中,元素'C'在数组位置2,3重复出现两次. 9 // 注意!有些元素没有重复出现,比如元素'B'. 10 private String[] data = { "

算法—8.有序数组中的二分查找

1.具体算法 /** * 算法3.2 二分查找(基于有序数组) * Created by huazhou on 2015/11/29. */ public class BinarySearchST<Key extends Comparable<key>, Value> { private Key[] keys; private Value[] vals; private int N; public BinarySearchST(int capacity){ keys = (Key[

算法设计--在数组中找求和最大的连续子串

问题:输入具有n个整数的向量arr,输出向量的任意连续子向量和的最大值 特殊情况(1.当向量都为正数时,为整个向量 2.当向量都为负数时,为0,即空子串 ) 1.O(n2)的算法 (循环对所有情况进行遍历) 1 #include <stdio.h> 2 #define max(a,b) ((a>b)?a:b) 3 #define max3(a,b,c) ((a>b)?((a>c)?a:c):((b>c)?b:c)) 4 5 int find1(int arr[], in

算法题1 数组中唯一出现1次的数|唯一出现2次的数

题目描述:一个整型数组里除了1个数字之外,其他的数字都出现了两次,请写程序找出这个只出现一次的数字.要求时间复杂度是 O(n),空间复杂度是 O(1),例如输入数组{2, 4, 3, 3, 2, 5 },因为只有 4 这个数字只出现一次,其他数字都出现了两次,所以输出 4 思路分析:本题以及延伸题目,在剑指offer上有详细描述.利用异或的特性,x^y^x=y^x^x=y.对数组所有元素一次进行异或操作,最终得到的值就是那个只出现一次的数字 代码 1 int FindOnceNum(int ar