LeetCode 第54~55题
LeetCode 第54题:螺旋矩阵
给你一个m行n列的矩阵matrix,请你按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
解题思路:
- 对于已经访问过的数字,可将其标记为无穷或者null,从而避免重复访问。
- 用一个长为4的方向数组DIRS = [(0,1),(1,0),(0,-1),(-1,0)]分别表示右下左上四个方向。同时用一个下标di表示当前方向,初始值为0。
- 每次移动,相当于把行号增加DIRS[di][0],把列号增加DIRS[di][1]。
- 向右转90°,相当于把di增加1,但在di=3时要回到di=0。两种情况合二为一,把di更新为(di+1)mod 4。
const int DIRS[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//右下左上int *spiralOrder(int** matrix,int matrixSize,int* matrixColSize,int* returnSize) {int m=matrixSize,n=matrixColSize[0];int* ans = malloc(m*n*sizeof(int));*returnSize = m*n;int i=0,j=0,di=0;for(int k=0,k<m*n;k++){ans[k] = matrix[i][j];matrix[i][j]=INT_MAX;//标记int x=i+DIRS[di][0],y=j+DIRS[di][1];//下一步的位置//如果出界或者已经访问过if(x<0||x>=m||y<0||y>=n||matrix[x][y]==INT_MAX)di = (di+1)%4; //右转90°i=i+DIRS[di][0],j=j+DIRS[di][1];//向该方向走一步}return ans; }
LeetCode 第55题:跳跃游戏
题目描述:
给你一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true,否则返回false。
示例1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 105
nums=[3,2,1,0,4]
解题思路:
i nums[i] i+nums[i] mx 0 3 3 3 1 2 3 3 2 1 3 3 3 0 3 3 4 4 8 失败 nums=[2,3,1,1,4]
i nums[i] i+nums[i] mx 0 2 2 2 1 3 4 4 2 1 3 4 3 1 4 4 4 4 8 8
- 从左到右遍历nums,同时维护能跳到的最远位置mx,初始值为0。
- 如果i>mx,说明无法跳到i,返回false。
- 否则,用i+nums[i],更新mx的最大值。
- 如果循环中没有返回false,那么最后返回true。
#define MAX(a,b) ((b)>(a)?(b):(a));bool canJump(int* nums,int numsSize) {int mx = 0;//标记值for(int i=0;i<numsSize;i++){if(i>mx) return false;mx = MAX(mx,i+nums[i]);//从i最右可以跳到i+nums[i]}return true; }