算法进修Day-28

算法进修Day-28

55. 跳跃游戏

难度:中等
题目要求
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false

示例1

输入:nums = [2,3,1,1,4]
输出:true

示例2

输入:nums = [3,2,1,0,4]
输出:false

题解

采用动态规划,具体步骤如下:

  • 定义 l e n len len 为数组长度, m a x L e n g t h maxLength maxLength 为当前所能到达的最大下标
  • 进行循环,当 i < l e n i i<len && m a x L e n g t h < n − 1 maxLengthmaxLength<n1 时循环继续
  • 如果下标 i > m a x L e n g t h i>maxLength i>maxLength 时,说明无法达到目标下标,返回 f a l s e false false
  • m a x L e n g t h maxLength maxLength 变为 m a x L e n g t h , n u m s [ i ] + i maxLength,nums[i]+i maxLength,nums[i]+i的最大值
  • 最后返回 t r u e true true

想法代码

class Solution
{
    public static void Main(String[] args)
    {
        int[] nums = { 2, 3, 1, 1, 4 };
        Solution solution = new Solution();
        bool res = solution.CanJump(nums);
        Console.WriteLine(res);
    }

    public bool CanJump(int[] nums)
    {
        int len = nums.Length;
        int maxLength = 0;
        for (int i = 0; i < len && maxLength < len - 1; i++)
        {
            if (i > maxLength)
            {
                return false;
            }
            maxLength = Math.Max(maxLength, nums[i] + i);
        }
        return true;
    }
}

56. 合并区间

难度:中等
题目要求
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

示例1

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]

示例2

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]

题解

基于区间左边界完成数组升序排序
遍历数组:若区间右边界小于后继区间左边界,直接将当前区间添加到结果数组中,否则更新后继区间的左边界为当前区间左边界,若当前区间右边界小于后继区间右边界,继续循环;否则更新当前区间右边界为后继区间的右边界
将数组最后一个区间添加到数组中。

想法代码

public class Solution
{
    public static void Main(string[] args)
    {
        int[][] intervals =
        {
            new[] { 1, 3 },
            new[] { 2, 6 },
            new[] { 8, 10 },
            new[] { 15, 18 }
        };
        Solution solution = new Solution();
        int[][] res = solution.Merge(intervals);
        foreach (var i in res)
        {
            foreach (var j in i)
            {
                Console.Write(j + " ");
            }
            Console.WriteLine();
        }
    }

    public int[][] Merge(int[][] intervals)
    {
        if (intervals.Length == 0)
        {
            return intervals;
        }
        intervals = intervals.OrderBy(p => p[0]).ToArray();

        List list = new List();
        for (int i = 0; i < intervals.Length - 1; i++)
        {
            if (intervals[i][1] >= intervals[i + 1][0])
            {
                intervals[i + 1][0] = intervals[i][0];

                if (intervals[i][1] >= intervals[i + 1][1])
                {
                    intervals[i + 1][1] = intervals[i][1];
                }
            }

            else
            {
                list.Add(intervals[i]);
            }
        }

        list.Add(intervals[intervals.Length - 1]);

        int[][] result = list.ToArray();
        return result;
    }
}

你可能感兴趣的:(算法进修,算法,leetcode,c#)