题目1、设计函数delab(array[],a,b),功能是在一个非递减的序列中,删除所有值大于a?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题目1、设计函数delab(array[],a,b),功能是在一个非递减的序列中,删除所有值大于a?相关的知识,希望对你有一定的参考价值。

什么是滑动窗口算法

滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合。

假设有数组 [a b c d e f g h ],一个大小为 3 的 滑动窗口 在其上滑动,则有:

[a b c]
[b c d]
[c d e]
[d e f]
[e f g]
[f g h]
一般情况下就是使用这个窗口在数组的 合法区间 内进行滑动,同时 动态地 记录一些有用的数据,很多情况下,能够极大地提高算法地效率。

1. 滑动窗口最大值

题目来源于 LeetCode 上第 239 号问题:滑动窗口最大值。题目难度为 Hard,目前通过率为 40.5% 。

题目描述
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。

返回滑动窗口最大值。

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
题目解析
利用一个 双端队列,在队列中存储元素在数组中的位置, 并且维持队列的严格递减,,也就说维持队首元素是 **最大的 **,当遍历到一个新元素时, 如果队列里有比当前元素小的,就将其移除队列,以保证队列的递减。当队列元素位置之差大于 k,就将队首元素移除。

补充:什么是双端队列(Dqueue)
Deque 的含义是 “double ended queue”,即双端队列,它具有队列和栈的性质的数据结构。顾名思义,它是一种前端与后端都支持插入和删除操作的队列。

Deque 继承自 Queue(队列),它的直接实现有 ArrayDeque、LinkedList 等。

动画描述

动画描述 Made by Jun Chen

代码实现
class Solution
public int[] maxSlidingWindow(int[] nums, int k)
//有点坑,题目里都说了数组不为空,且 k > 0。但是看了一下,测试用例里面还是有nums = [], k = 0,所以只好加上这个判断
if (nums == null || nums.length < k || k == 0) return new int[0];
int[] res = new int[nums.length - k + 1];
//双端队列
Deque<Integer> deque = new LinkedList<>();
for (int i = 0; i < nums.length; i++)
//在尾部添加元素,并保证左边元素都比尾部大
while (!deque.isEmpty() && nums[deque.getLast()] < nums[i])
deque.removeLast();

deque.addLast(i);
//在头部移除元素
if (deque.getFirst() == i - k)
deque.removeFirst();

//输出结果
if (i >= k - 1)
res[i - k + 1] = nums[deque.getFirst()];


return res;


2. 无重复字符的最长子串

题目来源于 LeetCode 上第 3 号问题:无重复字符的最长子串。题目难度为 Medium,目前通过率为 29.0% 。

题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
题目解析
建立一个256位大小的整型数组 freg ,用来建立字符和其出现位置之间的映射。

维护一个滑动窗口,窗口内的都是没有重复的字符,去尽可能的扩大窗口的大小,窗口不停的向右滑动。

(1)如果当前遍历到的字符从未出现过,那么直接扩大右边界;
(2)如果当前遍历到的字符出现过,则缩小窗口(左边索引向右移动),然后继续观察当前遍历到的字符;
(3)重复(1)(2),直到左边索引无法再移动;
(4)维护一个结果res,每次用出现过的窗口大小来更新结果 res,最后返回 res 获取结果。
参考技术A 这道题的函数减去以后就变成了一个非递减的一个函数。 参考技术B 题目1、设计函数delab(array[],a,b),功能是在一个非递减的序列中,删除所有值大于a?

php array_intersect() 和 array_diff() 函数

在PHP中,使用 array_intersect 求两个数组的交集比使用 array_diff 求同样两个数组的并集要快。

如果要求数组 $a 与数组 $b 的差集的个数,应该使用 count($a) - count(array_intersect($a, $b)),而不要用 count(array_diff($a, $b)); 

前面要比后者快,在大数组中更为明显。 


$array1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$array2=array("e"=>"red","f"=>"black","g"=>"purple");


$result1 = array_diff($array1, $array2);  //获取$array1中和$array2中不同元素 (差集)

$result2 = array_intersect($array1, $array2);  //获取$array1中和$array2中相同元素 (交集)
print_r($result1);

//

Array
(
[b] => green
[c] => blue
[d] => yellow
)

//

print_r($result2);

//

Array
(
[a] => red
)

//

技术分享

以上是关于题目1、设计函数delab(array[],a,b),功能是在一个非递减的序列中,删除所有值大于a?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 从 Array 访问重载的构造函数

CC Functional Array

PHP递归题目

调整数组顺序使奇数位于偶数前面

C++程序设计题目

php array_intersect() 和 array_diff() 函数