【Leetcode-70.爬楼梯 -88.合并两个有序数组】

简介: 【Leetcode-70.爬楼梯 -88.合并两个有序数组】

Leetcode-70. 爬楼梯

题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

其中,1 <= n <= 45

  1. 递归(算法过大,超出时间限制)
int climbStairs(int n)
  {
    if (n <= 2)
      return n;
    return climbStairs(n - 1) + climbStairs(n - 2);
  }
  1. 动态规划,因为前两个的和可以表示第三个的结果。
    我们首先想到,走上第三阶的方法,可以看成:1.走上第二阶之后再走一阶,2.走上第一阶之后再走两阶,所以我们的思路是动态规划,第三阶的走法是前两阶走法的总和;
int climbStairs(int n)
  {
      //因为第一阶和第二阶可以直接表示,我们就直接返回
      //从第三阶开始,我们可以用前两阶的和表示
      //走上第三阶的方法,可以看成:
      //1.走上第二阶之后再走一阶
      //2.走上第一阶之后再走两阶
      //所以第三阶的走法是前两阶走法的总和
      if (n <= 2)
          return n;
      int dp[3];
      dp[1] = 1;
      dp[2] = 2;
      int ret;
      for (int i = 3; i <= n; i++)
      {
          //这里每次进入循环证明还没结束,需要更新ret以及dp[2]和dp[1]的值
          ret = dp[1] + dp[2];
          dp[1] = dp[2];
          dp[2] = ret;
      }
      return dp[2];
  }

Leetcode-88. 合并两个有序数组

1.暴力求解

思路:直接将nums2的元素放到nums1的后面,直接排序

int cmp(int* a, int* b) 
    {
        return *a - *b;
    }
    void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
    {
        for (int i = 0; i != n; ++i) 
        {
            nums1[m + i] = nums2[i];
        }
        qsort(nums1, nums1Size, sizeof(int), cmp);
    }

2.逆向双指针

思路:两个指针分别从nums1和nums2的最后一个非0元素开始,tail从nums1的最后一个元素开始,nums1[i]与nums2[j]比较,谁大谁就移到nums[tail]中;还要考虑到nums1的元素或者nums2的元素已经走完的情况,谁先走完,就把另外一个数组的元素移到nums[tail]处;

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
    {
        //i从nums1的最后一个非0元素开始遍历
        //j从nums2的最后开始遍历
        //tail从nums1的最后一个元素开始遍历
        int i = m - 1, j = n - 1, tail = m + n - 1;
        while (i >= 0 || j >= 0)
        {
            //nums1的元素全部走完时,将nums2中的元素全部移到tail;
            if (i == -1)
                nums1[tail--] = nums2[j--];
            //nums2的元素全部走完时,将nums2中的元素全部移到tail;
            else if (j == -1)
                nums1[tail--] = nums1[i--];
            //谁大谁就移到tail处
            else if (nums1[i] > nums2[j])
                nums1[tail--] = nums1[i--];
            else
                nums1[tail--] = nums2[j--];
        }
    }
目录
相关文章
|
3月前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
41 2
|
5月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
3月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
50 0
|
5月前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
5月前
|
算法
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
5月前
|
Python
【Leetcode刷题Python】977. 有序数组的平方
解决LeetCode "有序数组的平方" 问题的方法:使用Python内置的快速排序、直接插入排序(但会超时)和双指针技术,并给出了每种方法的Python实现代码。
30 1
【Leetcode刷题Python】977. 有序数组的平方
|
5月前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
5月前
|
Python
【Leetcode刷题Python】108. 将有序数组转换为二叉搜索树
LeetCode上108号问题"将有序数组转换为二叉搜索树"的Python实现,通过递归选取数组中间值作为根节点,构建高度平衡的二叉搜索树。
34 2
|
5月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
64 0
|
5月前
|
Python
【Leetcode刷题Python】26. 删除有序数组中的重复项
本文提供了一种使用快慢指针法在原地删除升序数组中重复元素的Python实现,返回删除后数组的新长度,同时保持元素的相对顺序。
52 0