|
| 1 | +using System; |
| 2 | +using System.Collections.Generic; |
| 3 | +using System.Text; |
| 4 | + |
| 5 | +namespace LeetCode_L19 |
| 6 | +{ |
| 7 | + //static void Main(string[] args) |
| 8 | + //{ |
| 9 | + // var solution = new Solution(); |
| 10 | + // while (true) |
| 11 | + // { |
| 12 | + // //int input = int.Parse(Console.ReadLine()); |
| 13 | + // //int input2 = int.Parse(Console.ReadLine()); |
| 14 | + // //int input3 = int.Parse(Console.ReadLine()); |
| 15 | + // string input = Console.ReadLine(); |
| 16 | + // //string input2 = Console.ReadLine(); |
| 17 | + // //int[] intArr = input.Split(',').Select(s => int.Parse(s)).ToArray(); |
| 18 | + // //int input2 = int.Parse(Console.ReadLine()); |
| 19 | + // //var builder = new DataStructureBuilder(); |
| 20 | + // //int?[] data = new int?[] { 1, 2, 3, 4, 5, null, 6, null, null, 7, 8 }; |
| 21 | + // //var tree = builder.BuildTree(data); |
| 22 | + // //var listNode = builder.BuildListNode(new int[] { 1, 4, 5 }); |
| 23 | + // //int[][] arr = new int[3][] { new int[] { 1, 3, 1 }, new int[] { 1, 5, 1 }, new int[] { 4, 2, 1 } }; |
| 24 | + // //string input = "abcbefga"; |
| 25 | + // //string input2 = "dbefga"; |
| 26 | + // //int[] nums2 = new int[] { 2, 1, 1, 5, 11, 5, 1, 7, 5, 6, 4, 3 }; |
| 27 | + // //int[] nums3 = new int[] { 10, 15, 20 }; |
| 28 | + // //int[] nums1 = new int[] { 10, 1, 2, 7, 6, 1, 5 }; |
| 29 | + // //IList<IList<int>> data = new List<IList<int>>() |
| 30 | + // //{ |
| 31 | + // // new List<int>() { 1, 3 }, |
| 32 | + // // new List<int>() { 3, 0, 1 }, |
| 33 | + // // new List<int>() { 2 }, |
| 34 | + // // new List<int>() { 0 } |
| 35 | + |
| 36 | + // // //new List<int>() { 1 }, |
| 37 | + // // //new List<int>() { 2 }, |
| 38 | + // // //new List<int>() { 3 }, |
| 39 | + // // //new List<int>() { } |
| 40 | + // //}; |
| 41 | + // var res = solution.MinimumOperations(input); |
| 42 | + // ConsoleX.WriteLine(res); |
| 43 | + // } |
| 44 | + //} |
| 45 | + |
| 46 | + public class Solution |
| 47 | + { |
| 48 | + /// <summary> |
| 49 | + /// 动态规划优化,压缩的状态空间。复习的时候最好还是用没有优化空间的版本,那个版本思路更容易理解,更清晰 |
| 50 | + /// 时间复杂度:O(n) |
| 51 | + /// 空间复杂度:O(1),压缩状态到了一个只需要 3 个长度的数组 |
| 52 | + /// </summary> |
| 53 | + /// <param name="leaves"></param> |
| 54 | + /// <returns></returns> |
| 55 | + public int MinimumOperations(string leaves) |
| 56 | + { |
| 57 | + //压缩多维dp,因为只需要使用前一个状态 |
| 58 | + int[] dp = new int[3]; |
| 59 | + for (int i = 0; i < leaves.Length; i++) |
| 60 | + { |
| 61 | + int pre0 = dp[0]; |
| 62 | + int pre1 = dp[1]; |
| 63 | + int pre2 = dp[2]; |
| 64 | + |
| 65 | + //维护第一维,如果为 y,就要花一步把这个 y 变为 r |
| 66 | + if (i == 0) |
| 67 | + dp[0] = leaves[0] == 'r' ? 0 : 1; |
| 68 | + else |
| 69 | + dp[0] = pre0 + (leaves[i] == 'r' ? 0 : 1); |
| 70 | + |
| 71 | + //维护第二维,要从第二个才开始 |
| 72 | + if (i > 0) |
| 73 | + if (i == 1) |
| 74 | + dp[1] = pre0 + (leaves[i] == 'y' ? 0 : 1); |
| 75 | + else |
| 76 | + dp[1] = Math.Min(pre1, pre0) + (leaves[i] == 'y' ? 0 : 1); |
| 77 | + |
| 78 | + //维护第三维,要从第三个才开始 |
| 79 | + if (i > 1) |
| 80 | + if (i == 2) |
| 81 | + dp[2] = pre1 + (leaves[i] == 'r' ? 0 : 1); |
| 82 | + else |
| 83 | + dp[2] = Math.Min(pre2, pre1) + (leaves[i] == 'r' ? 0 : 1); |
| 84 | + } |
| 85 | + return dp[2]; |
| 86 | + } |
| 87 | + |
| 88 | + ///// <summary> |
| 89 | + ///// 多维动态规划,目前做一维简单的动态规划还可以,一复杂点就开始摸不清了 o(╥﹏╥)o |
| 90 | + ///// 时间复杂度:O(n) |
| 91 | + ///// 空间复杂度:O(n),具体来说是 3n |
| 92 | + ///// </summary> |
| 93 | + ///// <param name="leaves"></param> |
| 94 | + ///// <returns></returns> |
| 95 | + //public int MinimumOperations(string leaves) |
| 96 | + //{ |
| 97 | + // //多维dp,dp[0,]表示全部为 r 的状态,dp[1,]表示全部为 ry 的状态,dp[2,]表示全部为 ryr 的状态。 |
| 98 | + // int[,] dp = new int[3, leaves.Length]; |
| 99 | + // //针对二三维的边界,提前填充数据 |
| 100 | + // dp[1, 0] = dp[2, 0] = dp[2, 1] = int.MaxValue; |
| 101 | + // for (int i = 0; i < leaves.Length; i++) |
| 102 | + // { |
| 103 | + // //维护第一维,如果为 y,就要花一步把这个 y 变为 r |
| 104 | + // if (i == 0) |
| 105 | + // dp[0, i] = leaves[i] == 'r' ? 0 : 1; |
| 106 | + // else |
| 107 | + // dp[0, i] = leaves[i] == 'r' ? dp[0, i - 1] : dp[0, i - 1] + 1; |
| 108 | + |
| 109 | + // //维护第二维,要从第二个才开始 |
| 110 | + // if (i > 0) |
| 111 | + // dp[1, i] = Math.Min(dp[1, i - 1], dp[0, i - 1]) + (leaves[i] == 'y' ? 0 : 1); |
| 112 | + |
| 113 | + // //维护第三维,要从第三个才开始 |
| 114 | + // if (i > 1) |
| 115 | + // dp[2, i] = Math.Min(dp[2, i - 1], dp[1, i - 1]) + (leaves[i] == 'r' ? 0 : 1); |
| 116 | + |
| 117 | + // } |
| 118 | + // return dp[2, leaves.Length - 1]; |
| 119 | + //} |
| 120 | + } |
| 121 | +} |
0 commit comments