本文总结:

1、数组运算

  • 三个数最大乘积

2、数组统计

  • 使用Map或者Set来实现。比如重复、丢失。
  • 快排。比如H指数等。

3、数组移动

  • 旋转数组,考虑冒泡,来实现O(1)空间移动元素。
  • 移动最小次数使数组元素一样

4、数组乘积

  • 除自身以外的数组乘积。
  • 区域和检索 – 数组不可变。 k-n的和为sum(n)-sum(k)

1 常用算法

1.1 二分查找相关

常用算法-二分查找

1.2 冒泡

常用在数组移动操作中

2 数组遍历

2.1 报数

 有 10个人围成一个圈,从 1 开始报数,报到 4 的这个人就要退出。然后其他人重新开始, 从 1 报数,到 4 退出。问:最后剩下的是 10 人中的第几个人?

中止:list.size == 1

部分中止:i%4==0

发现4之后:使用数组的remove方法。

执行结果:5

2.2 最大连续1的数

给定一个二进制数组, 计算其中最大连续1的个数。

示例 1:

输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-consecutive-ones

算法:需要考虑只有一个元素情况,后者结尾依然是1的情况

2.3 提莫攻击

在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的中毒状态总时长。

你可以认为提莫在给定的时间点进行攻击,并立即使艾希处于中毒状态。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/teemo-attacking

算法:

  • 末尾处理还得+duration

2.4 第三大数

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/third-maximum-number

算法1 : 优先级队列和hashset。 

  • 第K大,使用优先级队列。
  • 防重使用HashSet

 

算法2 三个变量

2.5 三个最大积

给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:

链接:https://leetcode-cn.com/problems/maximum-product-of-three-numbers/

算法:

  • 最大积有三种情况,直接获取这三种情况最大值
  • 快排时,注意break;

2.6  除自身以外数组的乘积

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

输入: [1,2,3,4]
输出: [24,12,8,6]

来源:力扣(LeetCode)
链接:http://:https://leetcode-cn.com/problems/product-of-array-except-self

算法思想:构造两个数组,一个保存元素左边的乘积,一个保存元素右边乘积。

2.7 区域和检索 – 数组不可变

给定一个整数数组  nums,求出数组从索引 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点。

链接:https://leetcode-cn.com/problems/range-sum-query-immutable/

算法思想: k-n的和为sum(n)-sum(k)

3 数组运算

3.1 两数求和

问题:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

参考:https://leetcode-cn.com/problems/two-sum

举例:

算法实现:

4 数组合并

4.1 合并有序数组 

输入两个有序数组,合并成一个有序数组

 5 数组元素统计

5.1  数组中重复的和缺失的数 

用到方法有:HashSet/HashMap/快排

5.1.1 查找重复和缺失数

集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。

给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-mismatch

算法:通过set来记录多余元素,并通过set来检查缺失元素

5.3.2 查找缺失数

给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

找到所有在 [1, n] 范围之间没有出现在数组中的数字。

您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array

算法:使用用HashSet记录1到n出现的数,然后扫描1到n的数,看那些没有在set中。代码类似5.1.1

5.3.4 缺失的第一个正数

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

示例 1:

算法:

  • 考虑。数组值是1-n。

 

5.1.3 数组重复的数据

给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。

找到所有出现两次的元素。

你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-all-duplicates-in-an-array

算法: 先快排,再遍历数组。

5.1.4 H数

给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。

h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的 N – h 篇论文每篇被引用次数 不超过 h 次。)

例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。

示例:

输入:citations = [3,0,6,1,5]
输出:3
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/h-index

算法:

  • 第一步 快排。
  • 第二步 计算H参数:如果h为5,那么倒数第5篇的引用肯定要大于5的。

5.2 数组度

给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。

你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。

示例 1:

输入: [1, 2, 2, 3, 1]
输出: 2
解释:
输入数组的度是2,因为元素1和2的出现频数最大,均为2.
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组[2, 2]的长度为2,所以返回2.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/degree-of-an-array

算法 :

  • 作为数组的度的元素,只需要统计这个元素的开始和结束位置,就是这个元素最小子数组的长度。使用三个map来保存这些信息

 

6 数组移动

6.1 最小移动次数使数组元素相等

给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动将会使 n – 1 个元素增加 1。

示例:

输入:
[1,2,3]

输出:
3

解释:
只需要3次移动(注意每次移动会增加两个元素的值):

[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements

算法

  • 查找最小值
  • 依次累加每个元素和最小元素差值。

 

6.2 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes

算法: 冒泡的思想,从后遍历数组,发现0,就向右依次冒泡。

6.3 删除一个元素实现非递减

算法思想:找到第一个有问题节点,然后分为两种情况:删除前一个节点和删除当前节点来处理

  • 删除前一个节点和删除当前节点来处理可以通过逻辑删除来实现。

 

7 数组旋转

7.1 旋转指定k的数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array

算法:使用冒泡移动数组,循环从0开始执行冒泡,循环次数由k决定。

 

8 多维数组

常用算法-多维数组(矩阵)

分类&标签