Leetcode刷题 2021.01.24
作者:互联网
Leetcode刷题 2021.01.24
Leetcode674 最长连续递增序列
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。
今天的每日一题,加了连续的最长递增序列,变得简单不少。因为是连续,所以不需要用dp记录之前的状态了,直接双指针滑动窗口即可。
class Solution {
public int findLengthOfLCIS(int[] nums) {
if (nums.length == 0) return 0;
int n = nums.length;
int i = 0, j = 1, res = 1;
while (j < n){
//双指针,如果j大于j之前的数,就加1
while(j < n && nums[j] > nums[j - 1]){
j++;
}
//更新最大值
if (j - i > res){
res = j - i;
}
//更新i的位置
i = j;
//j设置比i大1
j++;
}
return res;
}
}
Leetcode419 甲板上的战舰
给定一个二维的甲板, 请计算其中有多少艘战舰。 战舰用 'X’表示,空位用 '.'表示。 你需要遵守以下规则:
给你一个有效的甲板,仅由战舰或者空位组成。
战舰只能水平或者垂直放置。换句话说,战舰只能由 1xN (1 行, N 列)组成,或者 Nx1 (N 行, 1 列)组成,其中N可以是任意大小。
两艘战舰之间至少有一个水平或垂直的空位分隔 - 即没有相邻的战舰。
力扣有些题的翻译真的是一言难尽,看了好半天和评论的解释才明白。这题因为战舰之间一定有间隔,而且战舰一定是长方形的。所以只要战舰的头部的左上方没有其他战舰就是一艘了。
class Solution {
public int countBattleships(char[][] board) {
int m = board.length, n = board[0].length;
int res = 0;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
//如果战舰的左上方没有其他战舰,就是一艘战舰
if (board[i][j] == 'X' && (i == 0 || board[i - 1][j] == '.') && (j == 0 || board[i][j - 1] == '.')){
res++;
}
}
}
return res;
}
}
Leetcode1014 最佳观光组合
给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。
一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。
返回一对观光景点能取得的最高分。
这题也没想用dp之类的做,想法比较简单。遍历数组的时候记录一下当前可以提供的最大值就好了,这里最大值不单单是元素大小,还要记录元素下标的大小,元素下标对于整体大小是有负作用的,所有记录的时候记录下标即可。代码就比较简单了。
class Solution {
public int maxScoreSightseeingPair(int[] A) {
int max = 0, res = 0;
for(int i = 1; i < A.length; i++){
//记录全局“最大”值的下标,这里最大值和元素大小以及元素下标有关
res = Math.max(res, A[max] + A[i] + max - i);
//更新当前最大
if (A[max] + max - i < A[i]){
max = i;
}
}
return res;
}
}
标签:24,2021.01,int,res,++,board,max,战舰,Leetcode 来源: https://blog.csdn.net/weixin_43447128/article/details/113100074