数组类

88. 合并两个有序数组

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6] 解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标红的为 nums1 中的元素。

如果按照合并两个有序链表的思路来处理,那还需额外申请一个数组存储nums1数组中前m个元素(后面的n个0除外),代码如下:
但是可以使用反向双指针来操作,这样就不用额外申请一个数组了,具体操作还是和合并两个有序链表一样的。代码如下:

  1. public void merge(int[] nums1, int m, int[] nums2, int n) {
  2. // p1 指向数组1最后一个元素(后面的0除外),p2指向数组2最后一个元素
  3. int p1 = m - 1, p2 = n - 1;
  4. // end 指向数组1尾部
  5. int end = m + n - 1;
  6. // 跟合并两有序链表类似
  7. while(p1 >= 0 && p2 >= 0) {
  8. if(nums1[p1] >= nums2[p2]) {
  9. nums1[end--] = nums1[p1--];
  10. } else {
  11. nums1[end--] = nums2[p2--];
  12. }
  13. }
  14. // 数组 1 还没处理完
  15. while(p1 >= 0) {
  16. nums1[end--] = nums1[p1--];
  17. }
  18. // 数组 2 还没处理完
  19. while(p2 >= 0) {
  20. nums1[end--] = nums2[p2--];
  21. }
  22. }

顺丰03. 收件节节高

题目给定一个数组,要求输出连续递增天数长度。

输入:[54,42,62,75,82,86,86] 输出:5 解释: 小哥A最近一周的收件数分别是:54,42,62,75,82,86,86,那么小哥A在这周的日收件最大连续增长天数是5 - 小哥A在这周第2天开始到第6天的日收件数都是在增长

  • 第7天与第6天收件数一样,不算增长

思路:遍历一遍数组,定义两个变量,max用来记录当前所得的连续递增天数的最大值,cur用来记录当前递增天数的长度,算法流程如下:

  • 初始定义max = 1cur = 1
  • 遍历数组,从下标1到尾下标:
    • 如果nums[i] > nums[i - 1],说明是递增,cur++,然后max暂存当前最大值;
    • 否则,让cur = 1,重新开始计数;
      class Solution {
      public int findMaxCI(int[] nums) {
         int max = 1, cur = 1;
         for(int i = 1; i < nums.length; i++) {
             if(nums[i] > nums[i - 1]) {
                 cur++;
                 max = Math.max(max, cur);
             } else {
                 cur = 1;
             }
         }
         return max;
      }
      }