每日十道算法

2023-11-15

最近发现了一个挺厉害的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以点击此链接进行查看:床长人工智能教程

 废话不多说,请看正文!

1、两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。

时间复杂度:$O(n)
空间复杂度:$O(n) 

import java.util.*;
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1.length == 0 || nums2.length == 0 || nums1 == null || nums2 == null){
            return new int[0];
        }
         Set<Integer> s = new HashSet<>();
         Set<Integer> s2 = new HashSet<>();
         for(int i : nums1){
             s.add(i);
         }
         for(int i : nums2){
             if(s.contains(i)){
                s2.add(i);
             }
         }
         int[] res = new int[s2.size()];
         int j = 0;
         for(Integer i : s2){
             res[j++] = i;
         }
         return res;
    }
}

2、两个数组的交集 II

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。 

时间复杂度:$O(m + n)
空间复杂度:$O(min(m,n)) 

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        if (nums1.length > nums2.length) {
            int[] temp = nums1;
            nums1 = nums2;
            nums2 = temp;
        }
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int num : nums1) {
            int count = map.getOrDefault(num, 0) + 1;
            map.put(num, count);
        }
        int[] res = new int[nums1.length];
        int index = 0;
        for (int num : nums2) {
            int count = map.getOrDefault(num, 0);
            if (count > 0) {
                res[index++] = num;
                count--;
                if (count > 0) {
                    map.put(num, count);
                } else {
                    map.remove(num);
                }
            }
        }
        return Arrays.copyOfRange(res, 0, index);
    }
}

3、在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res = new int[2];
        if (nums.length == 0 || nums == null){
            res[0] = -1;
            res[1] = -1;
            return res;
        }
        int left = 0;
        int right = nums.length - 1;
        res[0] = -1;
        res[1] = -1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == target){
                res[0] = mid;
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }

        left = 0;
        right = nums.length - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == target){
                res[1] = mid;
                left = mid + 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }
        return res;
    }
}

4、在排序数组中查找数字 I

统计一个数字在排序数组中出现的次数。 

class Solution {
    public int search(int[] nums, int target) {
        if(nums == null && nums.length == 0){
            return 0;
        }
        int[] ans = new int[2];
        ans[0] = -1;
        ans[1] = -1;
        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == target){
                ans[0] = mid;
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }

        left = 0;
        right = nums.length - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == target){
                ans[1] = mid;
                left = mid + 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }
        if(ans[0] == -1 && ans[1] == -1){
            return 0;
        }
        return ans[1] - ans[0] + 1;
    }
}

5、数组中的第K个最大元素

时间复杂度:$O(n的平方)
空间复杂度:$O(1)
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

 

class Solution {
    public int findKthLargest(int[] nums, int k) {
        return sortK(nums,0,nums.length - 1,nums.length - k);
    }
    private static int sortK(int[] nums, int left, int right, int k) {
        if (left < right){
            int i = left;
            int j = right;
            int pivot = nums[left];
            while (i < j){
                while (i < j && nums[j] >= pivot)
                {
                    j--;
                }
                swap(nums,i,j);
                while (i < j && nums[i] <= pivot){
                    i++;
                }
                swap(nums,i,j);
            }
            if(i > k){
                sortK(nums,left,i - 1,k);                
            }else if(i < k){
                sortK(nums,i + 1,right,k);                
            }
        }
        return nums[k];
    }

    public static void  swap(int[] nums,int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

6、前 K 个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 

 

import java.util.*;
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        int[] res = new int[k];
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int num : nums){
            map.put(num,map.getOrDefault(num,0) + 1);
        }

        Set<Map.Entry<Integer,Integer>> set = map.entrySet();
        PriorityQueue<Map.Entry<Integer,Integer>> queue = new PriorityQueue<>((o1,o2) ->{return o1.getValue() - o2.getValue();});
        for(Map.Entry<Integer,Integer> entry: set){
            queue.offer(entry);
            if(queue.size() > k){
                queue.poll();
            }
        }
        for(int i = k - 1; i>=0; i--){
            res[i] = queue.poll().getKey();
        }
        return res;
    }
}

7、零矩阵

编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。 

 

 时间复杂度:$O(n²)
空间复杂度:$O(m + n)

class Main {
    public void main(int[][] matrix) {
        if(matrix == null){
            return;
        }
        int[] m  = new int[matrix.length];
        int[] n = new int[matrix[0].length];
        for(int i = 0; i < matrix.length; i++){
            for(int j = 0; j < matrix[0].length; j++){
                if(matrix[i][j] == 0){
                    m[i] = 1;
                    n[j] = 1;
                }
            }
        }

        for(int i = 0; i < matrix.length; i++){
            for(int j = 0; j < matrix[0].length; j++){
                if(m[i] == 1 || n[j] == 1){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

8、螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

时间复杂度:$O(n²)
空间复杂度:$O(n)

import java.util.*;

class Main {
    public List<Integer> main(int[][] matrix) {
        if(matrix == null || matrix.length == 0){
            return null;
        }
        List<Integer> res = new ArrayList<>();
        int left = 0;
        int right = matrix[0].length - 1;
        int top = 0;
        int bottom = matrix.length - 1;
        while (left < right && top < bottom) {
            for (int i = left; i < right; i++) {
                res.add(matrix[top][i]);
            }
            for (int i = top; i < bottom; i++) {
                res.add(matrix[i][right]);
            }
            for (int i = right; i > left; i--) {
                res.add(matrix[bottom][i]);
            }
            for (int i = bottom; i > top; i--) {
                res.add(matrix[i][left]);
            }
            left++;
            right--;
            bottom--;
            top++;
        }
        if (bottom == top) {
            for (int i = left; i <= right; i++) {
                res.add(matrix[top][i]);
            }
        }else if(left == right){
            for (int i = top; i <= bottom; i++) {
                res.add(matrix[i][right]);
            }
        }

        return res;
    }
}

9、螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

 

时间复杂度:$O(n²)
空间复杂度:$O(n²)

class Solution {
    public int[][] generateMatrix(int n) {
        if( n == 0){
            return null;
        }
        int[][] matrix = new int[n][n];
        int left = 0;
        int right = matrix[0].length - 1;
        int top = 0;
        int bottom = matrix.length - 1;
        int sum = 1;
        while (left < right && top < bottom) {
            for (int i = left; i < right; i++) {
                matrix[top][i] = sum++;
            }
            for (int i = top; i < bottom; i++) {
                matrix[i][right] = sum++;
            }
            for (int i = right; i > left; i--) {
                matrix[bottom][i] = sum++;
            }

            for (int i = bottom; i > top; i--) {
                matrix[i][left] = sum++;
            }
            left++;
            top++;
            bottom--;
            right--;
        }
        if (top == bottom) {
            for (int i = left; i <= right; i++) {
                matrix[top][i] = sum++;
            }
        } else if (left == right) {
            for (int i = top; i <= bottom; i++) {
                matrix[i][right] = sum++;
            }
        }
        return matrix;
    }
}

10、旋转图像

 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

时间复杂度:$O(n²)
空间复杂度:$O(1) 

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for (int i = 0; i < n / 2; i++) {
            for (int j = 0; j < (n + 1) / 2; j++) {
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - j][i];
                matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
                matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
                matrix[j][n - 1 - i] = tmp;
            }
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每日十道算法 的相关文章

随机推荐

  • ESX虚拟机克隆后提示设备"0"的配置无效

    一般是克隆后mac地址与原网卡mac地址不符导致的 解决办法 下载虚拟机 vmx文件 修改其中的跟网卡eth0相关的mac地址跟实际mac相符 实在不行就删除网卡0 再添加一块网卡 有时候网卡驱动类型不符也不会报类似的错误 虚拟网卡一般有三
  • 区块链100讲:Hyperledger Fabric 中的链码(智能合约)

    1 链码概念 网络运行环境我们已经启动完成 现在我们从开发者的角度来认识一下完成交易所必须的智能合约 在 Hyperledger Fabric 中被称之为 Chaincode 也就是链上代码 的相关知识 以便于理解账本中的数据到底是通过什么
  • Windows 找不到文件 ‘gpedit.msc‘。请确定文件名是否正确后,再试一次。(已解决)

    今天在使用命令gpedit msc打开组策略编辑器报错 Windows 找不到文件 gpedit msc 请确定文件名是否正确后 再试一次 离谱 我都没改过设置什么的 后来找到解决办法 重新安装 桌面新建txt文档 文档里输入内容 echo
  • 程序员-接单网站

    远程工作平台 1 靠山云 https www kaoshanyun com 靠山云平台新型远程办公兼职平台 为中高端程序员 产品经理和设计师等等互联网相关人员提供稳定的线上工作机会 包括自由工作 远程工作和兼职工作 还支持按需雇佣 工作模式
  • C++ 程序抛异常产生的 core 文件,无法显示正确的函数调用栈信息(备忘)

    问题 比如 如下程序 include
  • Windows与Mac中idea常用快捷键转换

    从 Windows 过度到 Mac 必备快捷键对照表 Mac 键盘符号说明 Command Shift Caps Lock Option Control Return Enter Delete 向前删除键 Fn Delete 上箭头 下箭头
  • Xlua学习笔记

    本篇笔记是记录 游戏热更新实战案例 基于xLua 的学习笔记 1 Xlua的环境搭建 1 导入Xlua插件 上Github上下载Xlua插件 将Xlua解压 将Asset下的所有文件拷贝到当前项目目录Asset下 拷贝与Asset同级目录下
  • 关于STM32L系列MCU adc 测地信号不为0

    关于STM32L011系列MCU adc 测地信号不为0 Analog模拟adc测试为40或更大 如图所示 之前请教很多工程师说 adc 引脚没有接到真正的地信号 AD IO 一般 RC 过后到IO或者其它干扰影响 但最终也没有解决 尝试新
  • 框架——Mybatis中resultType和resultMap的区别

    一 区别简述 1 Mybatis的结果集是通过反射实现的 2 MyBatis中在查询进行select映射的时候 返回类型可以用resultType 也可以用resultMap resultType是直接表示返回类型 基础类型 包装类型 而r
  • 数据结构---填数字

    填数字 JAVA实现 C 实现 JAVA实现 public static int myFindABC int total 0 int sum 0 HashMap
  • 大规模部署lxc容器遇到的若干问题

    线程数控制 启动线程过多会导致资源不足引发的lxc start命令无法执行问题 到致大量容器只执行了lxc copy 而无法真正运行 具体情况应视服务器硬件条件 cpu 内存 在本项目部署中主要瓶颈在于cpu 以及当前服务器状态 当前主要是
  • Nginx Proxy Manger-反向代理神器-Docker一键部署

    Nginx Proxy Manger 反向代理神器 利用Docker实现一键部署 Lunix发行版 推荐使用Debian 10 或者 Ubuntu 20 04或更高版本 Nginx Proxy Manger 是一个反向代理管理系统 它基于
  • vuex存储保存数据、使用数据,超详细解说

    之前的项目中使用过一次vuex搭配localstorage存储token 使token持久化保存 好长时间不用 又把vuex的使用忘的一干二净 重新百度搜索 自己尝试后实现需求 我的业务需求是父页面中嵌套了一个子页面 父页面的一个卡片列表区
  • k8s job机制初探

    博客作为学习笔记记录 若有理解或表述错误 欢迎指出 k8s的job机制 k8s官网参考 k8s的job是用来执行一次性任务的一类资源 相关的还有cronjob 用于执行以下周期性任务 部署job之后 k8s会起对应pod 当pod的状态为f
  • Python- 文件处理

    os path splitext file 0 获取文件名 file endswith c 用于检查一个文件名 存储在变量 file 中 是否以 c 结尾 如果是这样 那么它可能是一个 C 语言源代码文件 接下来 os path split
  • float类型做比较

    public class tst private float a 3 0f private float b 0 0f private float c 4 0f private float d 0 0f public void floatCo
  • 软件工程专业如何论文选题?

    Ladies and gentlemen 写论文可谓是读书阶段最为关键的一环 你们是否还记得被论文折磨的日日夜夜 最可怕的不是导师催促你时铁青的面容 而是眼看着DDL Deadline 来临 你的论文题目却让你一筹莫展 作为一个硕士毕业没多
  • 下载和编译 Chrome 时遇到的问题

    下载代码前最基本的代理设置 https blog csdn net siyu77 article details 50916320 对于 ShadowSocks 代理 https proxy 也要设置成 http localhost 108
  • QtextBrowser打印数据不能实时显示的问题

    在编写程序的时候需要从外部读取txt文件的数据打印到QtextBrowser文本框中 但是发现数据是卡一下然后一起出来 而不是一行一行地实时显示 编程环境是vs2017编译器下的集合qt插件的C 界面编程 原来的程序段如下 ui datao
  • 每日十道算法

    最近发现了一个挺厉害的人工智能学习网站 内容通俗易懂 风趣幽默 感兴趣的可以点击此链接进行查看 床长人工智能教程 废话不多说 请看正文 1 两个数组的交集 给定两个数组 编写一个函数来计算它们的交集 时间复杂度 O n 空间复杂度 O n