LeetCode-239

题目

说一下原来的思路

/*
 * @lc app=leetcode id=239 lang=csharp
 *
 * [239] Sliding Window Maximum
 */

public class Solution
{
    public int[] MaxSlidingWindow(int[] nums, int k)
    {
        //Key为值,Value为索引
        LinkedList<KeyValuePair<int, int>> ts = new System.Collections.Generic.LinkedList<KeyValuePair<int, int>>();
        List<KeyValuePair<int, int>> ls = new List<KeyValuePair<int, int>>();
        for (int i = 0; i < k; i++)
        {
            var pair = new KeyValuePair<int, int>(nums[i], i);
            ls.Add(pair);
        }
	    //将数据按从首到为从小到大排序
        ls.OrderBy(x => x.Key).ToList().ForEach(x => ts.AddLast(x));

        var list = new List<int>();
        list.Add(ts.Last().Key);
        for (int i = 1; i <= nums.Count() - k; i++)
        {
            int maxn1 = nums[i + k - 1]; // maxn2;
            if (maxn1 > ts.Last().Key)
            {
                list.Add(maxn1);
                add(ts, new KeyValuePair<int, int>(nums[i + k - 1], i + k - 1), i - 1);
            }
            else
            {
                add(ts, new KeyValuePair<int, int>(nums[i + k - 1], i + k - 1), i - 1);
                list.Add(ts.Last().Key);
            }
        }
        return list.ToArray();
    }
	
    //三参数为当前窗口的最小值索引位置
    private static void add(LinkedList<KeyValuePair<int, int>> ts, KeyValuePair<int, int> pair, int index)
    {
        var stack = new Stack<KeyValuePair<int, int>>();
        //是否移除最小索引标记
        var flag = false;
        while (ts.Count > 0 && ts.Last().Key > pair.Key)
        {
            var f = ts.Last();
            if (f.Value == index && !false)
            {
                flag = true;
            }
            else
            {
                stack.Push(ts.Last());
            }

            ts.RemoveLast();
        }

        stack.Push(pair);
        if (!flag)
        {
            while (ts.Count > 0)
            {
                var f = ts.Last();
                if (f.Value == index)
                {
                    flag = true;
                    ts.RemoveLast();
                    break;
                }
                else
                {
                    stack.Push(f);
                    ts.RemoveLast();
                }
            }
        }

        while (stack.Count > 0)
        {
            ts.AddLast(stack.Peek());
            stack.Pop();
        }
    }
}



新解法的思路

public class Solution
{
    public int[] MaxSlidingWindow(int[] nums, int k)
    {
        LinkedList<int> ts = new System.Collections.Generic.LinkedList<int>();

        var list = new int[nums.Count() -k + 1];
        for (int i = 0; i < nums.Count(); i++)
        {
            int maxn1 = nums[i];
            if (ts.Count > 0 && ts.First.Value <= i - k) ts.RemoveFirst();
            while (ts.Count > 0 && nums[ts.Last.Value] <= maxn1)
            {
                ts.RemoveLast();
            }

            ts.AddLast(i);
            var index = i - k + 1;
            if (index >= 0)
                list[index] = nums[ts.First.Value];
        }
        return list;
    }
}
← 返回首页