目录
1. 螺旋矩阵(LeetCode 54 题)
1.1题目
1.2思路
写了写遍历矩阵的下标不难发现会以这样的规律分部 行为i 列为j
j++,i++,j--,i--;这样的周期分部,同时如果之前填充过数字可以构建一个布尔类型mapk的矩阵进行判定是否到边界。有种贪吃蛇的感觉。
本解法的时间空间复杂度均为m*n。所以效率极高。
1.3代码
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
int maxk = m*n;
boolean[][] kmap =new boolean[n][m];
int k = 1;
List<Integer> res = new ArrayList<>();
res.add(matrix[0][0]);
kmap[0][0]=true;
int i=0;
int j=0;
while (k<maxk){
while (j+1<m&&!kmap[i][j+1]){
j++;
k++;
kmap[i][j]=true;
res.add(matrix[i][j]);
}
while (i+1<n&&!kmap[i+1][j]){
i++;
k++;
kmap[i][j]=true;
res.add(matrix[i][j]);
}
while (j-1>=0&&!kmap[i][j-1]){
j--;
k++;
kmap[i][j]=true;
res.add(matrix[i][j]);
}
while (i-1>=0&&!kmap[i-1][j]){
i--;
k++;
kmap[i][j]=true;
res.add(matrix[i][j]);
}
}
return res;
}
}
2. 螺旋矩阵 II(LeetCode 59 题)
2.1题目
2.2思路
和上体一致,不过可以不用构建map函数,这里可以优化一下。直接用原矩阵操作即可。
时间复杂度和空间复杂度均为n2。
2.3代码
class Solution {
public int[][] generateMatrix(int num) {
int n = num;
int m = num;
int maxk = m*n;
int [][] res = new int[n][m];
int k = 1;
res[0][0] = 1;
if (num==1)return res;
int i=0;
int j=0;
while (k<maxk){
while (j+1<m&&res[i][j+1]==0){
j++;
k++;
res[i][j]=k;
}
while (i+1<n&&res[i+1][j]==0){
i++;
k++;
res[i][j]=k;
}
while (j-1>=0&&res[i][j-1]==0){
j--;
k++;
res[i][j]=k;
}
while (i-1>=0&&res[i-1][j]==0){
i--;
k++;
res[i][j]=k;
}
}
return res;
}
}
3. 旋转链表(LeetCode 61 题)
3.1题目
3.2思路
遍历一遍链表,取出链表长度。然后这个题需要旋转,我们首先找到旋转点,采用取余的方法对旋转点求值(k%listLength)然后分别同两个链表存储前半段和后半段,最后拼接即可。
till取旋转点旋转后的数据。通过如下代码实现。
这段取到旋转后旋转点前的数据。
拼接即可得到答案。
整体的时间复杂度为n,因为没有构造复杂的存储结构,也是n数量级的因此空间复杂度也为n。
3.3代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head==null) return null;
ListNode res = new ListNode(0);
ListNode pnode = res;
ListNode inputnode = head;
ListNode tempnode = inputnode;
ListNode tillhead = new ListNode(0);
ListNode till = tillhead;
int sum = 0;
while (tempnode!=null){
sum++;
tempnode=tempnode.next;
}
int i = 1;
tempnode = inputnode;
int j = sum-k%sum;
while (tempnode!=null&&i<=j){
till.next=new ListNode(tempnode.val);
till=till.next;
tempnode=tempnode.next;
i++;
}
while (tempnode!=null){
pnode = pnode.next;
tempnode=tempnode.next;
}
pnode.next = tillhead.next;
return res.next;
}
}
4.小结
刷题有一些了,也有了一定的手感。但是对于一些方法还是需要认真学习,同时写的代码不够精炼,变量定义随意,以后还需认真改正。对于困难的题型应做到及时复习反复练习。加油~已经刷力扣养成习惯,明天见。