重塑矩阵
题目地址: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)
代码均由力扣编译器,提交通过,描述编写不当地方还请大家评论区指出💪!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/140708.html