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

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

function find_maximum_lenarray(A,low,high){
    if(high==low){
        return [low,high,0]
    }else{
        var mid=(low+high)>>1
        /*[left_low,left_high,left_sum]*/
        var left=find_maximum_lenarray(A,low,mid)
        /*[right_low,right_high,right_sum]*/
        var right=find_maximum_lenarray(A,mid+1,high)
        /*[cross_low,cross_high,cross_sum]*/
        var cross=find_max_crossing_lenarray(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_lenarray(arr,0,arr.length-1)
cc.log(re2)//=>-3,-2,-1 [1,3,3]

时间: 2024-10-08 19:05:45

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

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

//分治算法研究var cc=consolefunction 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           

分治法求一个数组中最大最小值

分治法:将一个复杂的一分为二,然后对这两部分递归调用该函数,直到找到函数出口,求解出最简单的情况 需要注意的是分治时开始和结束位置参数的选择,一开始写的是s到mid-1,另一个是mid到e,然后就会数组为奇数个时结果对,为偶数个时结果错,后面改为s到mid,另一个是mid+1到e 结果就对了. #include<iostream> using namespace std; #define N 10 #define MAX(a,b)(a>b?a:b) #define MIN(a,b)(a&

分治法解决寻找数组中最大最小值的问题

输入: 数组A[i,…,j] 输出:数组A[i,…,j]中的max和min 1. If  j-i+1 =1   Then 输出A[i],A[i],算法结束 2. If  j-i+1 =2   Then 3.      If  A[i]< A[j]  Then输出A[i],A[j];算法结束 4. k<--(j-i+1)/2 5. m1,M1<--MaxMin(A[i:k]); 6. m2,M2 <--MaxMin(A[k+1:j]); 7. m <--min(m1,m2);

分治法——最大子数组

题目描述: 给定一个n个元素的数组a,求a[i]+a[i+1]+-+a[j]的最大值(0 <= i <= j < n) 解题思路: 我们来试试用分治法来解决这个问题.首先我们想要找到一个子数组a[i-j]为最大子数组,我们假设数组的中点为mid,可以将数组a[low-high]分成两个子数组:a[low-mid]和a[mid+1-high],那么最大子数组必然为下述三种可能之一: 1) low <= i , j <= mid ; 2) mid < i , j <=

使用分治法得到一个数中位元为1的个数

有这么一个问题, 给定一个数(假定32位), 如何得到这个数转为二进制后1的个数? 解: X=(x & 0x55555555)+((x>>1)&0x55555555) X=(x & 0x33333333)+((x>>2)&0x33333333) X=(x & 0x0F0F0F0F)+((x>>4)& 0x0F0F0F0F) X=(x & 0x0000FFFF)+((x>>1)& 0x0000FF

排序和搜索----数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 解答(C++): class Solution { public: int findKthLargest(vector<int>&

【分治法】在数组A中,返回i&lt;j,且A[i]&gt;A[j]的(i,j)配对的数量

题目:EPI 在本题中,把数组分成左右两部分,分别计算左右两部分的invrted pair的数量,再计算A[i] 和 A[j]一边一个的情况,然后把三者相加. int count_invert_core(vector<int> &arr,int begin,int end) { if (end - begin + 1 < 2) return 0; if (end - begin + 1 == 2) { if (arr[begin] > arr[end]) return 1;

数组中字指定数量连续符串的【模糊匹配 】

需求是有多个输入框输入的数值,连续输入指定数量的的字符文字, 在其他输入项中不能重复,因此使用模糊匹配的方式,返回匹配的状态, 详细看下面的代码: /** 三个公司名称模糊匹配 * @param strArr 需要匹配的字符串数组 * @param len 需要匹配的最小连续字符长度 */ function comNameCompare(strArr,len){ var result = ''; if(strArr.length == 3 ){ // 需求是三个输入框必须要填,下面是模糊匹配方法

[Swift]LeetCode845. 数组中的最长山脉 | Longest Mountain in Array

Let's call any (contiguous) subarray B (of A) a mountain if the following properties hold: B.length >= 3 There exists some 0 < i < B.length - 1 such that B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1] (Note tha