leetcode-初级算法之数组篇

一、题目:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

思路:
正向遍历,一快一慢指针,如果两指针指向数相同,慢指针不动,快指针向后移动,知道指向的数不同时,将快指针的值往前挪(挪动到慢指针往前走一步的位置)
反向遍历,此时就不用考虑前移的情况,前后两个值相同时,直接把后面那个值删除就好
异或的方法,如果前后两个数相同,则异或结果为0,当然这时候要考虑是正向遍历的还是反向遍历的,就跟上面两个结合就好

二、题目:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)

思路:
不能多次购买,只能二次购买前就要卖掉之前的。因此,只要后一天比当天的数字大,就买下来,然后第二天卖出来,当然,如果数组承递减的,那么就不买,收入为0

三、题目:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数

思路:
在这个问题中要考虑的一点就是,当K大于数组长度时候该怎么办?所以要K%length
直接采用数组切片形式,从K出开始切割,并且倒叙拼接
采用多次反转再拼接。先将数组逆置,然后将前K个反转,再把剩余的反转
利用临时数组,将临时数组的值重新赋值给原数组的指定位置上
还有一个办法,将数组看成是环形,每一个都往后移动K位。在其中,特别注意当K%length=0的情况,会进入死循环,所以此时就要建立一个列表来记录每个数是否被访问过。

四、题目:给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false

思路:
对于python,可以用set()函数,最后再转list输出数组与原数组进行长度比较,长度变小了就说明由重复,反之没有
先对原数组排序,然后前后两个进行对比

五、题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

思路:
位运算。使用异或,将所有的元素都异或,出现两次的元素就可以去掉

set()函数。创建空set函数,然后逐一添加原数组中元素,如果添加失败,说明set()已经包含该元素,就把该元素从set中移除,最终set中只包含一个所求的函数
将数组重新按序排列,用快慢指针进行比较,相同的话就平移两个指针

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

思路:
先对数组进行排序。将两个数组排序,并用两个指针分别指向数组,如果指针的值相同,则将该值加入交集中,如果不同,则把值相对较小的指针向后移
使用map解决。map本质上是一个字典,key值是数组值,value是该值出现的次数。对数组1建立map,然后遍历数组2,查看map中是否包含数组2 的元素,若是,就把元素写入交集中,并把相对应的value-1

七、题目:给定一个由整数组成的非空数组所表示的非负整数在该数的基础上加一。 最高位数字存放在数组的首位,数组中每个元素只存储单个数字。

思路:
逆序遍历数组,最后一位加一,如果加和大于10,就将进位置1,并把当前位置为加和的余数,进位移到下一位添加
如果数组所有元素都是9,加1之后就变成1000(不管后面几个0),相反,只要有一位不是9,加1 之后直接返回即可

八、题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序

思路:
把非0的往前挪,遇到为0的就不管。遇到非0的,就重新赋给指针所指向的单位,并把指针后移,也就是将0的区域覆盖。最后把末尾部分补0就可以
类似于冒泡排序。利用双重循环,只要碰到为0的,就在内循环中将前后两个数调换位置
遍历数组,如果遇到0,则直接删除,并马上在末尾补0,在这期间,注意因删除元素而使原本的数组下标与元素不匹配的效果,此时就要将删除元素计数(如c,遍历下标为i),那么在判断当前元素是否为0就要从原来的nums[i]==0改为nums[i-c]==0(这个方法可以广泛应用于希望删除元素但是又可以继续遍历剩下元素)

九、题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
思路:
暴力破解法。采用两个for循环,直接遍历全数组
采用哈希表解决。虽然我不会

十、题目:请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)(nan难)

思路:
按行遍历所有元素,创建三个空数组,分别是行,列,小方块,用来存储遍历过的元素,如果元素已经存在任意一个数组中,则直接返回false。主要是在遍历时候如何确定当前元素属于哪个小方格中呢?g= r//3*3+c//3(其中g表示小方格的编号,r,c分别表示当前元素的行和列)

十一、题目:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像

思路:
先关于中心行上下对称交换,然后对角线交换

今天先整理到这,希望今天开始会越来越努力,会更好呀,共勉,冲鸭!!!

你可能感兴趣的:(leetcode总结篇,python,leetcode)