LeetCode-Algorithms #003 Longest Substring Without Repeating Characters, Database #177 Nth Highest S

Posted chang4

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-Algorithms #003 Longest Substring Without Repeating Characters, Database #177 Nth Highest S相关的知识,希望对你有一定的参考价值。

LeetCode-Algorithms #003 Longest Substring Without Repeating Characters

技术分享图片

 

 对于给定的字符串, 找出其每个字符都不重复的子串中最长的那个, 并返回该子串的长度:

想法还是遍历:

 1 class Solution {
 2     public int lengthOfLongestSubstring(String s) {
 3         // 如果s是null或空串, 就直接返回0
 4         if (s == null || "".equals(s))
 5             return 0;
 6         // 定义结果max
 7         int max = 1;
 8         // 定义遍历中用到的变量,表示要找的子串开始和结束的index
 9         int start = 0, end = 1;
10         // 把s转为字符数组
11         char[] arr = s.toCharArray();
12         // 遍历数组,子串的开始从原数组的第一个字符到倒数第二个字符
13         for (start = 0; start < arr.length - 1; start++) {
14             // end从start的下一个开始,到最后一个结束
15             // 创建一个HashSet用于储存和检验子串
16             HashSet<Character> sub = new HashSet<>();
17             // 把start位置的字符添加进HashSet
18             sub.add(arr[start]);
19             // 从start后面一个字符开始检验
20             for (end = start + 1; end < arr.length; end++) {
21                 // 如果end成功添加,证明没有重复,继续遍历,反之终止循环,继续下一个start
22                 if (sub.add(arr[end])) {
23                 } else {
24                     break;
25                 }
26             }
27             //如果本处开始的子串比max大就更新max
28             max = max>sub.size()? max : sub.size();
29         }
30         return max;
31     }
32 }

一看就知道效率很低, 等于是把所有不重复的子串都找出来比了一下, 好在一次通过:

技术分享图片

当然成绩也是惨不忍睹??

看一看21ms的答案

 1 class Solution {
 2     public int lengthOfLongestSubstring(String s) {
 3         // 显然结果为0
 4         int ans = 0;
 5         // 取出s的长度
 6         int len = s.length();
 7         // 建立长度为128的整数数组,对于ASCII码中的字符
 8         int[] indexArr = new int[128];
 9 
10         // 这里循环中用的是一种滑动窗口的思路
11         // i在前面走, j在后面跟,如果i和j中间没有重复,窗口就拉大
12         // 一旦出现了重复, j就跟到i的位置的字符上一次出现的位置后面一位
13         for (int i = 0, j = 0; i < len; i++) {
14             // 通过数组检验i位置的字符上一次出现的位置是在j之前还是j之后
15             // 如果是之前就维持j的位置不变,如果是之后就把j的位置推至上一次出现的位置之后一位
16             j = Math.max(indexArr[s.charAt(i)], j);
17             // 更新ans
18             ans = Math.max(ans, i - j + 1);
19             // 在整数数组对应字符的位置存入索引i+1,如原串中第三个字符是a,遍历到这里就在indexArr[97]存入3
20             // 实际上最后数组中存储的就是到目前为止,每个字符最后一次出现的位置
21             indexArr[s.charAt(i)] = i + 1;
22         }
23         //返回ans
24         return ans;
25     }
26 }

分析都写在注释里面了, 看了看比较快的一部分答案, 基本都是这个思路, 建立一个数组存储每一个出现过的字符最后一次出现的位置, 用滑动窗口检验子串

 

 

 

 

LeetCode-Database #177 Nth Highest Salary

技术分享图片

写个函数返回第N高的工资

事实证明我是真的不会写SQL函数, 当时学的时候就没怎么练??

连滚带爬的完成了:

 1 CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
 2 BEGIN
 3   DECLARE Nth INT DEFAULT N - 1;
 4   RETURN (
 5       # Write your mysql query statement below.
 6       SELECT DISTINCT Employee.Salary
 7       FROM Employee
 8       ORDER BY Employee.Salary DESC
 9       LIMIT Nth,1
10   );
11 END

也是大家写出来都一样的东西,贴两个比较顺眼的

1 CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
2 BEGIN
3   SET N = N - 1;
4   RETURN (
5       SELECT DISTINCT Salary FROM Employee GROUP BY Salary
6       ORDER BY Salary DESC LIMIT 1 OFFSET N
7   );
8 END
 1 CREATECREATE  FUNCTIONFUNCTION getNthHighestSalary(N INT) RETURNS INT
 2  getNthHighestSalary(N I BEGIN
 3   DECLARE offer_num INT DEFAULT N-1;
 4   RETURN (
 5       # Write your MySQL query statement below.
 6       SELECT IFNULL(
 7           (
 8               SELECT DISTINCT salary 
 9               FROM Employee
10               ORDER BY Salary DESC
11               LIMIT 1 OFFSET offer_num
12           ) , NULL
13       )AS "getNthHighestSalary"
14  );
15 END

 

以上是关于LeetCode-Algorithms #003 Longest Substring Without Repeating Characters, Database #177 Nth Highest S的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-algorithms-92. Reverse Linked List II

leetcode-algorithms-109. Convert Sorted List to Binary Search Tree

LeetCode-Algorithms 1. 两数之和

LeetCode-Algorithms #007 Reverse Integer, Database #182 Duplicate Emails

LeetCode-Algorithms #005 Longest Palindromic Substring, Database #179 Consecutive Numbers

LeetCode-Algorithms #001 Two Sum, Database #175 Combine Two Tables