刷题笔记(数组)-10

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 刷题笔记(数组)-10,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

重塑矩阵

题目地址:566. 重塑矩阵 – 力扣(LeetCode) (leetcode-cn.com)

刷题笔记(数组)-10

思路:

  • 根据题目要求,我们可以一开始先判断转换后矩阵的维度是否匹配转换前矩阵的维度,如果不匹配则直接返回输入矩阵即可
  • 新建一个矩阵作为返回值
  • 遍历 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)

刷题笔记(数组)-10

思路: 首先想到哈希表,但是题目给要求了,想了半天没想到不使用额外空间的方法,看了题解,涨知识了

异或运算有以下三个性质

  • 任何数和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次的元素

刷题笔记(数组)-10

思路:

  • 利用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)

刷题笔记(数组)-10

思路:

  • 首先使用哈希表记录每个数字的出现次数;
  • 随后再利用新的哈希表,统计不同的出现次数的数目。
  • 如果不同的出现次数的数目等于不同数字的数目,则返回 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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!