@@ -563,7 +563,7 @@ where
563563/// 要求序列满足 `[from, x]` cmp 返回 true, `[x+1, end]` 返回 false 
564564/// 即一开始必须时 true 
565565/// 
566- /// 返回的 `I` 不保证 `cmp(I) == true ` 
566+ /// 返回的 `I` 不保证 `cmp(I) == false ` 
567567/// 这个函数保证的是 `(I, end]` cmp不会返回true, `(I, end]` 可能是空 
568568/// 
569569/// 做了防溢出, `from`和`end`可以是0, 即传入索引 
@@ -623,10 +623,100 @@ pub fn min_capability(nums: Vec<i32>, k: i32) -> i32 {
623623    min
624624} 
625625
626+ 
627+ /// [2529. 正整数和负整数的最大计数](https://leetcode.cn/problems/maximum-count-of-positive-integer-and-negative-integer) 
628+ ///  
629+ /// 注意: 0 既不是正整数也不是负整数 
630+ ///  
631+ /// 思路: 利用单调性, 找到第一个正整数和最后一个负整数, 然后计算各自的长度 
632+ pub  fn  maximum_count ( nums :  Vec < i32 > )  -> i32  { 
633+     let  first_positive = { 
634+         let  tmp = first_occur ( 0 ,  nums. len ( ) -1 ,  |i| nums[ i]  > 0 ) ; 
635+         if  tmp == 0 { 
636+             if  nums[ 0 ]  > 0 { 
637+                 0i32 
638+             }  else  { 
639+                 1i32 
640+             } 
641+         }  else  if  tmp == nums. len ( ) { 
642+             nums. len ( )  as  i32 
643+         }  else  { 
644+             tmp as  i32 
645+         } 
646+ 
647+     } ; 
648+     let  last_negative = { 
649+         let  tmp = last_occur ( 0 ,  nums. len ( ) -1 ,  |i| nums[ i]  < 0 ) ; 
650+         if  tmp == 0  { 
651+             if  nums[ 0 ]  < 0 { 
652+                 1i32 
653+             }  else  { 
654+                 0i32 
655+             } 
656+         }  else  if  tmp == nums. len ( ) { 
657+             nums. len ( )  as  i32 
658+         }  else  { 
659+             tmp as  i32  + 1 
660+         } 
661+     } ; 
662+     
663+     let  pos_len = nums. len ( )  as  i32  - first_positive; 
664+     let  neg_len = last_negative; 
665+ 
666+     pos_len. max ( neg_len) 
667+ } 
668+ 
626669#[ cfg( test) ]  
627670mod  tests { 
628671    use  super :: * ; 
629672
673+     #[ test]  
674+     fn  test_maximum_count ( ) { 
675+         struct  TestCase { 
676+             name :  & ' static  str , 
677+             nums :  Vec < i32 > , 
678+             expect :  i32 , 
679+         } 
680+ 
681+         vec ! [ 
682+             TestCase { 
683+                 name:  "basic" , 
684+                 nums:  vec![ -5 ,  -4 ,  -3 ,  -2 ,  -1 ,  1 ,  2 ,  3 ,  4 ,  5 ] , 
685+                 expect:  5 , 
686+             } , 
687+             TestCase { 
688+                 name:  "basic 2" , 
689+                 nums:  vec![ -5 ,  -4 ,  -3 ,  -2 ,  -1 ,  0 ,  1 ,  2 ,  3 ,  4 ,  5 ] , 
690+                 expect:  5 , 
691+             } , 
692+             TestCase { 
693+                 name:  "basic 3" , 
694+                 nums:  vec![ 1 ,  2 ,  3 ,  4 ,  5 ] , 
695+                 expect:  5 , 
696+             } , 
697+             TestCase { 
698+                 name:  "basic 4" , 
699+                 nums:  vec![ -5 ,  -4 ,  -3 ,  -2 ,  -1 ] , 
700+                 expect:  5 , 
701+             } , 
702+             TestCase { 
703+                 name:  "basic 5" , 
704+                 nums:  vec![ 0 ,  1 ,  2 ,  3 ,  4 ,  5 ] , 
705+                 expect:  5 , 
706+             } , 
707+             TestCase { 
708+                 name:  "basic 6" , 
709+                 nums:  vec![ -5 ,  -4 ,  -3 ,  -2 ,  -1 ,  0 ] , 
710+                 expect:  5 , 
711+             } , 
712+         ] 
713+         . iter ( ) 
714+         . for_each ( |TestCase { name,  nums,  expect} |{ 
715+             let  actual = maximum_count ( nums. to_vec ( ) ) ; 
716+             assert_eq ! ( * expect,  actual,  "{} failed" ,  name) ; 
717+         } ) ; 
718+     } 
719+ 
630720    #[ test]  
631721    fn  test_min_capability ( )  { 
632722        struct  TestCase  { 
0 commit comments