刷题笔记(数组)-10
Posted 康小庄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题笔记(数组)-10相关的知识,希望对你有一定的参考价值。
重塑矩阵
题目地址:566. 重塑矩阵 - 力扣(LeetCode) (leetcode-cn.com)
思路:
- 根据题目要求,我们可以一开始先判断转换后矩阵的维度是否匹配转换前矩阵的维度,如果不匹配则直接返回输入矩阵即可
- 新建一个矩阵作为返回值
- 遍历 r * c 个元素的同时找到两个矩阵间对应的位置。
- 这是一个简单的除法问题:已知第i个元素,求在矩阵r行c列中的位置,即为i / c 行和 i % c 列
class Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
int a=mat.length;
int b=mat[0].length;
if (a*b!=r*c){
return mat;
}
int[][] res=new int[r][c];
for (int i=0;i<a*b;i++){
res[i/c][i%c]=mat[i/b][i % b];
}
return res;
}
}
只出现一次的数字
题目地址:136. 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com)
思路: 首先想到哈希表,但是题目给要求了,想了半天没想到不使用额外空间的方法,看了题解,涨知识了
异或运算有以下三个性质
- 任何数和0做异或运算,结果仍然是原来的数,即
a^0=a
- 任何数和其自身做异或运算,结果是 0,即
a^a=0
- 异或运算满足交换律和结合律,即
a^b^a=b^a^a=b^(a^a)=b^0=b
可以通过异或
来解决!
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
复杂度分析
- 时间复杂度:O(n),其中 n 是数组长度。只需要对数组遍历一次。
- 空间复杂度:O(1)
重复N次的元素
思路:
- 利用
HaspMap
特性,遍历数组,大于1的数就是
class Solution {
public int repeatedNTimes(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num,map.getOrDefault(num,0)+1);
}
for (Integer integer : map.keySet()) {
if (map.get(integer) >1){
return integer;
}
}
return 0;
}
}
复杂度分析
- 时间复杂度:O(N),其 N是
A
的长度。 - 空间复杂度:O(N)。
独一无二的出现次数
题目地址:1207. 独一无二的出现次数 - 力扣(LeetCode) (leetcode-cn.com)
思路:
- 首先使用哈希表记录每个数字的出现次数;
- 随后再利用新的哈希表,统计不同的出现次数的数目。
- 如果不同的出现次数的数目等于不同数字的数目,则返回
true
,否则返回false
。
class Solution {
public boolean uniqueOccurrences(int[] arr) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i : arr) {
map.put(i, map.getOrDefault(i, 0) + 1);
}
HashSet<Integer> set = new HashSet<>();
for (Map.Entry<Integer, Integer> integerEntry : map.entrySet()) {
set.add(integerEntry.getValue());
}
return map.size()==set.size();
}
}
复杂度分析
- 时间复杂度:O(N),其中N为数组的长度。遍历原始数组需要O(N)时间,而遍历中间过程产生的哈希表又需要O(N)的时间。
- 空间复杂度:O(N)
代码均由力扣编译器,提交通过,描述编写不当地方还请大家评论区指出💪!
以上是关于刷题笔记(数组)-10的主要内容,如果未能解决你的问题,请参考以下文章