剑指 Offer 专项突击版
学而知不足~
这个作者很懒,什么都没留下…
展开
-
Day05:剑指 Offer II 016. 不含重复字符的最长子字符串
题目给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。代码实现哈希表+滑动窗口class Solution { public int lengthOfLongestSubstring(String s) { int res = -1; if (s.equals(" ") || s.equals("")){ return s.length(); } Map<Characte原创 2022-01-29 18:42:43 · 428 阅读 · 0 评论 -
Day05:剑指 Offer II 015. 字符串中的所有变位词
题目给定两个字符串 s 和 p,找到 s 中所有 p 的 变位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。变位词 指字母相同,但排列不同的字符串。代码实现划动窗口class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> list = new LinkedList<>(); if(p.length原创 2022-01-29 17:17:00 · 144 阅读 · 0 评论 -
Day05:剑指 Offer II 014. 字符串中的变位词
题目给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。换句话说,第一个字符串的排列之一是第二个字符串的 子串 。代码实现滑动窗口class Solution { public boolean checkInclusion(String s1, String s2) { if (s1.length() > s2.length()){ return false; } int[] a原创 2022-01-29 16:56:18 · 537 阅读 · 0 评论 -
Day04:剑指 Offer II 013. 二维子矩阵的和
题目给定一个二维矩阵 matrix,以下类型的多个请求:计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。实现 NumMatrix 类:NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化int sumRegion(int row1, int col1, int row2, int col2) 返回左上角 (row1, col1) 、右下角 (row2, col2) 的子矩阵的元素总和。原创 2022-01-29 16:23:25 · 266 阅读 · 0 评论 -
Day04:剑指 Offer II 012. 左右两边子数组的和相等
题目给你一个整数数组 nums ,请计算数组的 中心下标 。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。代码实现前缀和class Solution { public int pivotIndex(int[] nums) {原创 2022-01-26 22:58:28 · 600 阅读 · 0 评论 -
Day04:剑指 Offer II 011. 0 和 1 个数相同的子数组
题目给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。代码实现前缀和如果光看示例容易让我们误以为奇数下标为0,偶数下标为1,或者每两个下标长度判断一次结果等偏激的思想。但当我们遇到连续0 或者连续1等特殊场景时,明显就不适用了。那么该如何变换后,可以适配前缀和的解题思维呢?我们不妨将所有0转化为-1,那么如果遇到了相同数量的0和1,累加之后的结果就为0,不是就又转化为前缀和的思想了么?解题思路如下:初始化哈希表,并添加{0:-1}声原创 2022-01-26 22:28:51 · 351 阅读 · 0 评论 -
Day04:剑指 Offer II 010. 和为 k 的子数组
题目给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。代码实现因为有负数,所以我们不能使用滑动窗口前缀和+双重遍历效率很低class Solution { public int subarraySum(int[] nums, int k) { int total = 0; int res = 0; for (int i = 1; i < nums.length; i++) { num原创 2022-01-26 21:28:09 · 485 阅读 · 0 评论 -
Day03:剑指 Offer II 009. 乘积小于 K 的子数组
题目给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 k 的连续的子数组的个数。代码实现滑动窗口class Solution { public int numSubarrayProductLessThanK(int[] nums, int k) { int left = 0; int ret = 0; int total = 1; for (int right = 0; right < nums.lengt原创 2022-01-24 23:30:40 · 150 阅读 · 0 评论 -
Day03:剑指 Offer II 008. 和大于等于 target 的最短子数组
题目给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。代码实现双指针public int minSubArrayLen(int target, int[] nums) { int res = Integer.MAX_VALUE; int left = 0;原创 2022-01-24 22:28:42 · 199 阅读 · 0 评论 -
Day03:剑指 Offer II 007. 数组中和为 0 的三个数
题目给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。代码实现基于快排class Solution { public List<List<Integer>> threeSum(int[] nums) { quickSort(nums,0,nums.length-1); List<List<Integer原创 2022-01-24 22:01:48 · 381 阅读 · 0 评论 -
Day02:剑指 Offer II 006. 排序数组中两个数字之和
题目给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。代码实现双指针class Solution { public in原创 2022-01-24 15:04:47 · 335 阅读 · 0 评论 -
Day02:剑指 Offer II 005. 单词长度的最大乘积
题目给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。代码实现暴力解忽略位运算可以用一个 int 型整数记录某个字符串中出现的字符。如果字符串包含 ‘a’,那么整数最右边的数位为 1,如果字符串包含 ‘b’,那么整数从右边起倒数第 2 位为 1。这样做的好处就是能更快地判定两个字符串是否包含相同的字符。如果两个字符串包含相同的字符,那原创 2022-01-24 14:58:08 · 186 阅读 · 0 评论 -
Day02:剑指 Offer II 004. 只出现一次的数字
题目给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。代码实现Map实现class Solution { public int singleNumber(int[] nums) { Map<Integer,Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) {原创 2022-01-24 14:23:25 · 178 阅读 · 0 评论 -
Day01:剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
题目给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。代码实现位运算public int[] countBits(int n) { int[] res = new int[n+1]; for (int i = 0; i <= n; i++) { for (int j = 31; j >= 0; j--) { if((i>>j &原创 2022-01-24 13:54:36 · 142 阅读 · 0 评论 -
Day01:剑指 Offer II 002. 二进制加法
题目给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。输入为 非空 字符串且只包含数字 1 和 0。代码实现模拟法class Solution { public String addBinary(String a, String b) { StringBuilder res = new StringBuilder(); //保证a的长度一定大于等于b if (a.length() < b.length()原创 2022-01-17 22:30:19 · 62 阅读 · 0 评论 -
Day01:剑指 Offer II 001. 整数除法
题目给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。注意:整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2的31次方, 2的31次方−1]。本题中,如果除法结果溢出,则返回 2的31次方 − 1代码实现用减法代替除法大佬代码// 因为将 -214748364原创 2022-01-17 21:35:40 · 58 阅读 · 0 评论