11.4:大于2倍问题

 11.4:大于2倍问题

 

[ 6  7  1  3  2]

每个数num,问num右边 有多少个数满足 :num > 右*2

6; 1 和 2;         6 > 右侧有2个数 [ 1 2 ] 乘以2 

7;    1、3和2;     7 > 右侧有3个数 [1 2 3 ] 乘以2 

1;                       1 > 右侧有0个数 [ ] 乘以2 

3;                       3 > 右侧有0个数 [ ] 乘以2 

2;                       2 > 右侧有0个数 [ ] 乘以2 

 

例:

  [ 1  4  6  8  9  |  1  1  2  3  3  4 ] 

    p                      r

 注意:p和r都是不回退的;

 

比如: 

      p指向1的时候,右侧的数*2都大于1的,r往右滑,滑不动,括了0个数[]

     [ 1   4   6   8   9  |   1   1   2   3   3   4 ] 

    p                         r

 

 

       p指向4的时候,右侧有1 和1 两个数*2小于4的满足题意,r往右滑,滑到1和2之间,r括了[1 1]

     [ 1  4  6  8  9  |  1  1   2   3   3   4 ] 

         p                       r

 

        p指向6的时候,右侧有2 这个数*2小于6的满足题意,r往右滑,滑到2和3之间,r括了[1 1 2]

     [ 1  4  6  8  9  |  1  1  2  3  3  4 ] 

            p                        r

 

      p指向8的时候,r继续往右侧滑,滑到3和4之间,r括了[1 1 2 3 3 ]

     [ 1  4  6  8  9  |  1  1  2  3  3  4 ] 

                p                            r

 

 

1、递归分组

2、在merge的时候:

  一、p指针从0~m逐个走一遍;

       二、p每走一格,判断右侧r指针往后走几个数,判断规则arr[p] > arr[r]*2;

              注意r每次不必复位到M+1位置

 

posted @ 2022-05-12 10:15  yzmarcus  阅读(23)  评论(0)    收藏  举报