415.字符串相加200.岛屿数量46.全排列92.反转链表Ⅱ142.环形链表Ⅱ23.合并k个升序链表54.螺旋矩阵

415.字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

输入:num1 = “11”, num2 = “123”
输出:“134”

  1. 模拟十进制加法。最后用StringBuilder.reverse()将字符串反转。

200.岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围

输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3

  1. dfs,找到一个岛屿就通过深搜把整个岛屿置为0。

46.全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

  1. dfs+回溯。

92.反转链表Ⅱ

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表 。

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

  1. 用pleft记录第left个节点的前驱节点,有个需要注意的地方,left=1时需要new一个节点作为链表的头结点,返回结果时不能返回head,因为这时候head.next已经被改变,而应该返回pleft.next

142.环形链表Ⅱ

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

  1. 先通过快慢指针判断有无环,得到快慢指针相碰撞的节点后,入环点肯定是在head和fast之间,再通过遍历设置计数器来得出入环点。
  2. 实际上,得出快慢指针碰撞点之后,由快指针走的路程是慢指针的两倍,那么就有b+c=a+b,即c=a,碰撞点到入环点的距离等于头结点head到入环点的距离,因此设置两个节点分别在那两个位置同步走,相碰的节点就是入环点。
    在这里插入图片描述

23.合并k个升序链表

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]

  1. 合并两个链表时,插入链表插入时要保存插入节点后继,被插入链表要保存节点后移时要保存当前节点前驱。答案给的一种是分治,但个人觉得一个循环就能解决的问题为什么非要写个递归函数实现呢。

54.螺旋矩阵

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

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

  1. 解题关键在于控制四个方向遍历时的边界条件,向右遍历到右边界时,矩阵上边界要加1;向下遍历到下边界时,右边界要减1;向左遍历到左边界时,下边界要减1;向上遍历到上边界时,左边界要加1。另一种写法是每次遍历一层,每次处理完一层后四个方向的边界要修改,这里要注意的是最后一层只有一列或者一行的情况
public List<Integer> spiralOrder(int[][] matrix) {
            List<Integer> res=new ArrayList<>();
            int top=0,bottom=matrix.length-1,left=0,right=matrix[0].length-1;
            while(top<=bottom&&left<=right)
            {
                if(left<=right)
                {
                    for(int i=left;i<=right;i++)
                    res.add(matrix[top][i]);
                    top++;
                }
                if(top<=bottom)
                {
                    for(int i=top;i<=bottom;i++)
                    res.add(matrix[i][right]);
                    right--;
                }
                if(left<=right&&top<=bottom) //这里要注意限定条件,处理一行的情况
                {
                    for(int i=right;i>=left;i--)
                    res.add(matrix[bottom][i]);
                    bottom--;
                }
                if(top<=bottom&&left<=right) //处理一列的情况
                {
                    for(int i=bottom;i>=top;i--)
                    res.add(matrix[i][left]);
                    left++;
                }
            }
            return res;
    }


今日总结

刷题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值