刷题笔记(数组)-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)

代码均由力扣编译器,提交通过,描述编写不当地方还请大家评论区指出💪!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值