本期讲思维转换类型问题,共7道题,三道简单题,四道中等题。

此部分题目是作者认为有价值去做的一些题,但是其考察的知识点不在前三篇总结系列里面。

  • 例1解法:采用数组索引位置排序的思想。
  • 例2解法:考察了组合数学的组合公式应用。有点类似动态规划的思想。
  • 例3解法:  考察灵活运用二进制和整除余数的数学知识。
  • 例4解法:动态规划思想的应用。
  • 例5解法:分类讨论的数学思想。
  • 例6解法:考察灵活运用哈希字典。
  • 例7解法:考察闰年的数学判断公式,计算周几的细节处理能力。

例1 最大宽度坡

题号:962,难度:中等

题目描述:

解题思路:

采用索引排序的思路,使得从前往后遍历时,A[i] < A[j]。然后不断更新i的最小值,当前遍历的索引即为j。即可求取最终结果。

具体代码:

class Solution {
public int maxWidthRamp(int[] A) {
int N = A.length;
Integer[] B = new Integer[N];
for (int i = 0; i < N; ++i)
B[i] = i; Arrays.sort(B, (i, j) -> ((Integer) A[i]).compareTo(A[j])); int result = 0;
int i = N;
for (int j: B) {
result = Math.max(result, j - i);
i = Math.min(i, j);
} return result;
}
}

执行结果:

例2 总持续时间可被60整除的歌曲

题号:1010,难度:简单

题目描述:

解题思路:

本题考察了组合数学公式的应用,以及数学知识的转换和迁移应用。

具体代码:

class Solution {
public int numPairsDivisibleBy60(int[] time) {
int[] temp = new int[60];
int result = 0;
for(Integer t: time) {
if(t % 60 == 0)
result += temp[0];
else
result += temp[60 - (t % 60)];
temp[t % 60]++;
} return result;
}
}

执行结果:

例3 可被5整除的二进制前缀

题号:1018,难度:简单

题目描述:

解题思路:

此题需要抓住整除的核心,即个位数是5的倍数时,即可整除5。我们只需要统计当前二进制数的个位数即可。

具体代码:

class Solution {
public List<Boolean> prefixesDivBy5(int[] A) {
List<Boolean> ans = new ArrayList<>(); int num = 0;
for (int i = 0;i < A.length;i++) {
num <<= 1;
num += A[i];
num %= 10;
ans.add(num % 5 == 0);
} return ans;
}
}

执行结果:

例4 不相交的线

题号:1035,难度:中等

题目描述:

解题思路:

此题考察我们动态规划思想的应用。动态递推方程:可参考代码。

具体代码:

class Solution {
public int maxUncrossedLines(int[] A, int[] B) { int[][] dp = new int[A.length + 1][B.length + 1];
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[0].length; j++) {
if (A[i - 1] == B[j - 1])
dp[i][j] = dp[i - 1][ j - 1] + 1;
else
dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);
}
}
return dp[A.length][B.length];
}
}

执行结果:

例5 递减元素使数组呈锯齿状

题号:1144,难度:中等

题目描述:

解题思路:

分类讨论。按照题目的意思,分奇数偶数讨论求解最终的最小操作次数即可。

具体代码:

class Solution {
public int movesToMakeZigzag(int[] nums) {
int odd = 0;
int eve = 0;
//偶数最高
for (int i = 0; i < nums.length; i+=2) {
int temp = 0;
if(i ==0){
temp = nums [1];
}else if (i==nums.length -1){
temp= nums[nums.length -2];
}else {
temp = nums [i-1]>nums[i+1]?nums[i+1]:nums [i-1];
}
if(temp<=nums[i]){
eve+=nums[i]-temp+1;
}
} //奇数最高
for (int i = 1; i < nums.length; i+=2) {
int temp = 0;
if (i==nums.length -1){
temp= nums[nums.length -2];
}else {
temp = nums [i-1]>nums[i+1]?nums[i+1]:nums [i-1];
}
if(temp<=nums[i]){
odd+=nums[i]-temp+1;
}
} return eve>odd?odd:eve;
}
}

执行结果:

例6 快照数组

题号:1146, 难度:中等

题目描述:

解题思路:

考察哈希字典的应用。

具体代码:

import java.util.Map.Entry;
class SnapshotArray {
int snap_id;
ArrayList<TreeMap<Integer,Integer>> list = new ArrayList<TreeMap<Integer,Integer>>();
public SnapshotArray(int length) {
list.clear();
for(int i = 0;i < length;i++) {
list.add(new TreeMap<Integer,Integer>());
}
}
public void set(int index, int val) {
TreeMap<Integer, Integer> pairMap = list.get(index);
Integer value = pairMap.getOrDefault(snap_id, val);
pairMap.put(snap_id, val);
}
public int snap() {
return snap_id++;
}
public int get(int index, int snap_id) {
Entry<Integer, Integer> entry = list.get(index).floorEntry(snap_id);
return entry == null ? 0 : entry.getValue();
}
} /**
* Your SnapshotArray object will be instantiated and called as such:
* SnapshotArray obj = new SnapshotArray(length);
* obj.set(index,val);
* int param_2 = obj.snap();
* int param_3 = obj.get(index,snap_id);
*/

执行结果:

例7 一周中的第几天

题号:1185,难度:简单

题目描述:

解题思路:

此题考察闰年的数学判定公式,以及对于月份的边界处理,对于细节的处理考察比较多。也是一道锻炼我们代码能力的经典算法题。(PS:不能调用库函数)当然,此题还可以参考LeetCode的评论中,一个名为蔡乐公式的解法,但是一般是记不住的。

具体代码:

class Solution {
public String dayOfTheWeek(int day, int month, int year) {
int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String[] result = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int init_y = 1999, init_m = 7, init_d = 18;
int all_days = 0;
if(year > init_y) {
all_days += 13;
for(int i = 7;i < 12;i++)
all_days += months[i];
for(int j = 2000;j < year;j++) {
if((j % 4 == 0 && j % 100 != 0) || j % 400 == 0)
all_days += 366;
else
all_days += 365;
}
for(int i = 0;i < month - 1;i++)
all_days += months[i];
all_days += day;
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
if(month > 2)
all_days++;
return result[all_days % 7];
} else if(year == init_y) {
if(month > init_m) {
all_days += 13;
for(int i = 7;i < month - 1;i++)
all_days += months[i];
all_days += day;
return result[all_days % 7];
} else if(month == init_m) {
if(day >= init_d)
all_days += (day - init_d);
int k = all_days % 7;
if(day < init_d) {
all_days += (init_d - day);
k = (7 - all_days % 7) % 7;
}
return result[k];
}
} else {
all_days += 18;
for(int i = 0;i < 6;i++)
all_days += months[i];
for(int j = 1998;j > year;j--) {
if((j % 4 == 0 && j % 100 != 0) || j % 400 == 0)
all_days += 366;
else
all_days += 365;
}
for(int i = month;i < 12;i++)
all_days += months[i];
all_days += months[month - 1] - day;
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
if(month < 2)
all_days++;
all_days = (7 - all_days % 7) % 7;
return result[all_days];
}
return result[0];
}
}

执行结果:

LeetCode刷题总结-数组篇(番外)的更多相关文章

  1. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

  2. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  3. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  4. leetcode 刷题(数组篇)26题 删除有序数组中的重复值 (双指针)

    题目描述 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额 ...

  5. leetcode 刷题(数组篇)4题 寻找两个正序数组的中位数(二分查找)

    题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 示例 1: 输入:nums1 = [1,3], nums2 = ...

  6. leetcode 刷题(数组篇)1题 两数之和(哈希表)

    题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元 ...

  7. leetcode 刷题(数组篇)152题 乘积最大子数组 (动态规划)

    题目描述 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子 ...

  8. leetcode 刷题(数组篇)15题 三数之和 (双指针)

    很有意思的一道题,值得好好思考,虽然难度只有Mid,但是个人觉得不比Hard简单 题目描述 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b ...

  9. leetcode 刷题(数组篇)74 题 搜索二维矩阵 (二分查找)

    二分查找要注意边界值的取值,边界情况的判定 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一 ...

随机推荐

  1. Python PDB调试处理

    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了 ...

  2. Nginx开启Gzip压缩提升页面加载速度

    1.在 nginx 的conf 目录下新建 gzip.conf 文件 #开启gzip压缩 gzip on; #设置允许压缩的页面最小字节数 gzip_min_length 1k; #申请4个单位为16 ...

  3. Spring项目启动报"Could not resolve placeholder"解决

    1.问题的起因: 除去properites文件路径错误.拼写错误外,出现"Could not resolve placeholder"很有可能是使用了多个PropertyPlace ...

  4. 章节十七章、2- 给执行失败的case截图

    一.案例演示 1.首先我们把截图的方法单独进行封装方便以后调用. package utilities; import java.io.File; import java.io.IOException; ...

  5. 配置code::blocks的glut环境

    code::blocks很小,特别适合小型项目及家用旧电脑上MingW下编程,当然windows还是安装的Visual Studio办公用的,现把配置过程记录一遍. 1.在百度搜code::block ...

  6. 《java编程思想》P22-P37(第二章一切都是对象)

    1.JAVA操纵的标识符实际上是对象的一个"引用";如String s;里的s是String类的引用并非对象. 2.程序运行时,有五个不同的地区可以存储数据. (1)寄存器:最快的 ...

  7. [JZOJ100047] 【NOIP2017提高A组模拟7.14】基因变异

    Description 21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的 ...

  8. Java SPI、servlet3.0与@HandlesTypes源码分析

    关于Java SPI与servlet3.0的应用,这里说的很精炼,链接地址如下. https://blog.csdn.net/pingnanlee/article/details/80940993 以 ...

  9. ArrayList源码解析[一]

    ArrayList源码解析[一] 欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 在工作中集合list集合用的相对来 ...

  10. WSL捣鼓记——图形化(以emacs为例)

    前言 这学期开始学习linux,但笔记本装了双系统之后指纹识别会失效,开虚拟机又十分占据内存,于是乎基本需要使用linux的时候就用wsl,可奈何只有命令行界面,在需要使用图形软件(如emacs)的时 ...