Leet Code初级算法-数组
Leet Code初级算法-数组
1、删除排序数组中的重复项
给你一个 升序排列 的数组 nums
,请你原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致
不要使用额外的空间,你必须在原地修改输入数组** 并在使用 O(1) 额外空间的条件下完成
示例1
1 | 输入:nums = [1,1,2] |
思路
使用双指针
- 如果右指针指向的值等于左指针指向的值,左指针不动
- 如果右指针指向的值不等于左指针指向的值,那么左指针往右移一步,然后再把右指针指向的值赋给左指针
实现代码
1 | public int removeDuplicates(int[] nums) { |
2、买卖股票的最佳时机 II
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
示例1
1 | 输入:prices = [7,1,5,3,6,4] |
示例2
1 | 输入:prices = [7,6,4,3,1] |
思路
首先购买股票要获取利润,所以检验卖出的比前一天购入的大于0,统计总获取利润即可
实现代码
1 | public int maxProfit(int[] prices) { |
3、旋转数组
给你一个数组,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例1
1 | 输入: nums = [1,2,3,4,5,6,7], k = 3 |
思路
思路1,临时数组的方式
声明一个临时数组的方式,将数组放到新的数组里面,然后将其放入对应位置即可,关键算法**(i + k) % length**
思路2,反转的形式
数组反转的形式,就是你可以将数组反转,全反转先后都行,然后在根据指定位置进行反转
思路3,看成是一个环
把数组看成是一个环,然后把当前值保存在下一个位置,保存之前把下一个位置的值给记录下来,
实现代码
声明一个临时数组的方式
1 | public void rotate(int[] nums, int k) { |
数组反转的方式
1 | public void rotate(int[] nums, int k) { |
数组看做成环
1 | public void rotate(int[] nums, int k) { |
4、存在重复元素
给你一个整数数组 nums
。如果任一值在数组中出现 至少两次 ,返回 true
;如果数组中每个元素互不相同,返回 false
。
示例1
1 | 输入:nums = [1,2,3,1] |
示例2
1 | 输入:nums = [1,2,3,4] |
思路
思路1,双指针遍历
给数组先排序,然后使用双指针遍历一下
思路2,Set集合
使用Set集合,将数据添加到Set集合中,因为Set集合数据不允许重复
实现代码
双指针遍历
1 | public boolean containsDuplicate(int[] nums) { |
Set集合
1 | public boolean containsDuplicate(int[] nums) { |
5、只出现一次的数字
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例1
1 | 输入:nums = [2,2,1] |
示例2
1 | 输入:nums = [4,1,2,1,2] |
思路
思路1,做异或
连续做异或
异或规则
a ^ 0 = a
a ^ a = 0
a ^ b ^ c = a ^ c ^ b
大白话:与0异或是自己本身,相同异或为0,多个异或符合交换律
思路2,Set集合
使用Set集合,因为Set集合数据不允许重复
实现代码
异或
1 | public int singleNumber(int[] nums) { |
Set集合
1 | public int singleNumber(int[] nums) { |
6、两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例1
1 | 输入:nums1 = [1,2,2,1], nums2 = [2,2] |
示例2
1 | 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] |
思路
思路1
现将两个数组排序,然后声明连个指针,判断两个数组大小,然后一次移动相对应指针即可,相等时,存入List集合,然后转成新的数组即可
思路2
先将一个数组存入Map集合中,key为数组值,value为出现的次数,然后遍历第二个数组,将第二个数组存入map集合,如果存在,则存入List集合中,并将出现的次数减少1,不存在则存入map集合中
实现代码
两个指针
1 | public int[] intersect(int[] nums1, int[] nums2) { |
map集合
1 | public int[] intersect(int[] nums1, int[] nums2) { |
7、加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例1
1 | 输入:digits = [1,2,3] |
思路
从最后一位开始遍历数组,如果最后一位不为9,将最后一位+1,如果为9,标记为0,继续,如果元素都为9,则扩充数组长度将第一位元素设置为1即可
实现代码
1 | public int[] plusOne(int[] digits) { |
8、移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例1
1 | 输入: nums = [0,1,0,3,12] |
思路
思路1
双指针,如果指针指向位置不为0,则两个指针都向后移,否则只移动i指针,然后从从index指针开始,后面的内容赋值为0即可
思路2
交换位置,只要不为0,就开始交换位置
实现代码
双指针
1 | public void moveZeroes(int[] nums) { |
交换位置
1 | public void moveZeroes(int[] nums) { |
9、两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例1
1 | 输入:nums = [2,7,11,15], target = 9 |
示例2
1 | 输入:nums = [3,2,4], target = 6 |
思路
思路1
暴力破解法 两遍for循环
思路2
Map集合,判断target - 当前值是否能在map中取出,能取出则返回符合条件的下标和当前下标,反之将当前值当做key,当前下标记为value
实现代码
两遍for循环
1 | public int[] twoSum(int[] nums, int target) { |
Map集合
1 | public int[] twoSum(int[] nums, int target) { |
10、有效的数独
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 ‘.’ 表示。
示例
输入:board =
[[“5”,”3”,”.”,”.”,”7”,”.”,”.”,”.”,”.”]
,[“6”,”.”,”.”,”1”,”9”,”5”,”.”,”.”,”.”]
,[“.”,”9”,”8”,”.”,”.”,”.”,”.”,”6”,”.”]
,[“8”,”.”,”.”,”.”,”6”,”.”,”.”,”.”,”3”]
,[“4”,”.”,”.”,”8”,”.”,”3”,”.”,”.”,”1”]
,[“7”,”.”,”.”,”.”,”2”,”.”,”.”,”.”,”6”]
,[“.”,”6”,”.”,”.”,”.”,”.”,”2”,”8”,”.”]
,[“.”,”.”,”.”,”4”,”1”,”9”,”.”,”.”,”5”]
,[“.”,”.”,”.”,”.”,”8”,”.”,”.”,”7”,”9”]]
输出:true
思路
现有知识不理解、有大佬懂得可以教一教我
实现代码
11、旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例
1 | 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] |
思路
想将二位数组上下交换位置,然后按照对角线进行交换即可
实现代码
1 | public void rotate(int[][] matrix) { |
正确的开始 微小的长进 然后持续 嘿 我是小博 带你一起看我目之所及的世界……
本文标题:Leet Code初级算法-数组
发布时间:2023年01月08日 - 02:25
最后更新:2023年01月08日 - 02:27
原始链接:https://codexiaobo.github.io/posts/2501102455/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。