剑指offer
神偷奶爸
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 48. 最长不含重复字符的子字符串
双指针法// 滑动窗口(双指针解法)class Solution { public int lengthOfLongestSubstring(String s) { int l=0,r=0; char[] c=s.toCharArray(); HashSet<Character> set=new HashSet(); int res=0; while(r<c.length){原创 2021-05-06 21:42:31 · 132 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数
class Solution { // 堆排序 ,利用PriorityQueue,构建大顶堆。 // 时间复杂度:O(nlogk),大根堆维护k个数,每次插入logk,最坏情况下n个数都会插进去一遍。 // 空间复杂度:O(k),大根堆里最多k个数 public int[] getLeastNumbers(int[] arr, int k) { int[] res=new int[k]; if (k == 0) { .原创 2021-01-09 19:25:38 · 62 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对
题目代码主体就是一个归并排序,在归并排序内部计数。class Solution { public int reversePairs(int[] nums) { if(nums.length<2){ return 0; } // 题上没说是否可以改变原数组就不要用原来的 int[] copy=new int[nums.length]; for(int i=0;i<num原创 2021-02-27 13:49:39 · 58 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串 mark
题目思路:代码class Solution { public boolean isNumber(String s) { Map[] states = { // 代码块的形式初始化 // 只记录每种状态可能发生的成功的转移 // 状态3,4,都是对小数点的处理。 // 因为需要分两种情况,如果整数部分没值或只有+,-。那么转向4之后,4必须接受数字才能跳转..原创 2021-02-26 23:41:39 · 58 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
class Solution { // 快速幂+递归,时空均为O(logn) public double myPow(double x, int n) { // 防止负数最小值溢出 long N=n; if(N>=0){ return quickmul(x, N); } return 1/quickmul(x, -N); } public double quickm.原创 2021-01-16 22:34:32 · 53 阅读 · 0 评论 -
剑指 Offer 49. 丑数
class Solution { // 动态规划,从最小丑数1开始,让每个丑数都分别乘2,3,5。但须将结果排序 // dp数组里存的是递增的丑数 // 注意需要去重,2*3与3*2出现一次就行。三个有序数组的合并(去重) public int nthUglyNumber(int n) { if(n==0){ return 0; } int[] dp=new int[n]; dp[0]=.原创 2021-01-16 21:43:59 · 41 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组
class Solution { // O(n)解法,时间复杂度为O(n) public int[] constructArr(int[] a) { if(a==null||a.length==0){ return new int[]{}; } int n=a.length; int[] res=new int[n]; int[] left=new int[n]; .原创 2021-01-16 20:49:21 · 51 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
class Solution { // 从下往上,动态规划。O(n^2) // 绳长为n, public int cuttingRope(int n) { int[] dp=new int[n+1]; for (int i = 2; i < dp.length; i++) { int max=0; for (int j = 1; j < i; j++) { m.原创 2021-01-15 16:21:48 · 84 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
class Solution { // 方块必须连着,不能跨界存在 // 广度优先遍历,空间复杂度O(mn),时间复杂度:考虑所有方块都可以进入,则O(mn) public int movingCount(int m, int n, int k) { if(k==0){ return 1; } int res=1; boolean[][] mark=new boolean[m][n]; .原创 2021-01-14 22:45:46 · 62 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
class Solution { public int findRepeatNumber(int[] nums) { int n=nums.length; int[] count=new int[n]; for(int i:nums){ count[i]++; } for(int i=0;i<n;i++){ if(count[i]>1) .原创 2021-01-14 17:58:42 · 34 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
class Solution { // 位运算,当前位规律是异或运算,进位规律是与运算。重复直到进位值为0,此时得出结果。 public int add(int a, int b) { while(a!=0){ // 进位 int c=(a&b)<<1; // 当前 int d=a^b; a=c; b=d; .原创 2021-01-14 17:45:01 · 42 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
class Solution { // 从右上开始找,空间O(1),时间最多循环O(m+n)次 public boolean findNumberIn2DArray(int[][] matrix, int target) { if(matrix==null||matrix.length==0||matrix[0].length==0 ){ return false; } int rows=matrix.length-1.原创 2021-01-14 16:48:08 · 43 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
class Solution { public String replaceSpace(String s) { char[] chars=s.toCharArray(); StringBuilder res=new StringBuilder(); for(char cur:chars){ if(cur==' '){ res.append("%20"); }else{ .原创 2021-01-14 16:26:14 · 48 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子
class Solution { public boolean isStraight(int[] nums) { // 首先所有牌除了大小王不能有重复,然后最大牌减去最小牌小于5即可 HashSet<Integer> set=new HashSet<>(); int max=0,min=14; for(int num:nums){ if(num==0){ co.原创 2021-01-14 16:19:25 · 75 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
class Solution { // 双指针左右靠近 public int[] exchange(int[] nums) { if(nums.length==0){ return new int[]{}; } int l=0,r=nums.length-1; while(l<r){ // 左偶数右奇数 if((nums[l]&1)== 0 .原创 2021-01-13 17:01:21 · 43 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数
class Solution { // 动态规划 public double[] dicesProbability(int n) { double[] pre=new double[]{1/6d,1/6d,1/6d,1/6d,1/6d,1/6d}; for(int i=2;i<=n;i++){ // 这里错了 // double[] temp=new double[n*6-n+1]; .原创 2021-01-13 13:15:34 · 47 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
class Solution { // 一道普通的动态规划题目,一开始没搞清楚意思 public int maxValue(int[][] grid) { if(grid.length==0||grid[0].length==0){ return 0; } for(int i=1;i<grid[0].length;i++){ grid[0][i]=grid[0][i]+grid[0][i-.原创 2021-01-12 22:41:27 · 45 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
class Solution { // 动态规划,时间复杂度为O(log10 N),即num的十进制位数。空间复杂度是O(1) public int translateNum(int num) { String s=String.valueOf(num); int first=1,second=1; String temp=""; int t=0; for(int i=2;i<=s.length();i+.原创 2021-01-12 22:06:07 · 45 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
class Solution { public String minNumber(int[] nums) { // 隐含了大数问题(x,y是int,但是拼接结果不一定),因此我们需要用字符串处理。 // 解法1,使用内置函数 Arrays.sort。 String[] s=new String[nums.length]; for (int i = 0; i <s.length; i++) { s[i]=S.原创 2021-01-12 11:47:03 · 104 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int res=0; int test=1; for(int i=0;i<32;i++){ if((test&n)!=0){ res++; } .原创 2021-01-11 13:38:31 · 39 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
class Solution { public String reverseWords(String s) { String ss=s.trim(); int i=s.length()-1; int j=s.length(); StringBuilder res=new StringBuilder(); while(i>=0){ while(i>=0&&s.charA.原创 2021-01-11 13:09:31 · 104 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
class Solution { public String reverseLeftWords(String s, int n) { // 解法1,0 ms // return s.substring(n,s.length())+s.substring(0,n); // 解法2,时间效率最差,取余的技巧 7ms // StringBuilder ss=new StringBuilder(); // for(int .原创 2021-01-10 17:23:17 · 95 阅读 · 1 评论 -
剑指 Offer 64. 求1+2+…+n
class Solution { public int sumNums(int n) { if(n==1){ return 1; } return sumNums(n-1)+n; }}原创 2021-01-10 16:56:32 · 60 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
class Solution { // 二分法,看大佬题解的说明 public int minArray(int[] numbers) { int l=0,r=numbers.length-1; while(l<r){ int mid=l+(r-l)/2; if(numbers[mid]<numbers[r]){ r=mid; }else if.原创 2021-01-10 16:45:36 · 49 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值
class MaxQueue { // 维护一个非严格单调递减的双端队列。记录队列最大值 Deque<Integer> markmax; Queue<Integer> queue; public MaxQueue() { markmax=new LinkedList(); queue=new LinkedList(); } public int max_value() { if.原创 2021-01-09 21:11:09 · 91 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列
// class Solution {// public int fib(int n) {// if(n==0||n==1){// return n;// } // // 重复算了很多遍,时间复杂度炸了// return (fib(n-1)+fib(n-2));// }// }// 动态规划class Solution { public int fib(int n) { .原创 2021-01-09 20:29:30 · 49 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串
class Solution { public int lengthOfLongestSubstring(String s) { int r=0; char[] c=s.toCharArray(); int ans=0; HashSet<Character> set=new HashSet(); for(int i=0;i<c.length;i++){ while(r<c.原创 2021-01-09 15:54:25 · 58 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列 mark
class Solution { List<String> res=new ArrayList(); char[] c; public String[] permutation(String s) { c=s.toCharArray(); dfs(0); return res.toArray(new String[res.size()]); } public void dfs(int position){.原创 2021-01-09 11:52:26 · 46 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
// class Solution {// // 中位数一定是众数// public int majorityElement(int[] nums) {// Arrays.sort(nums);// int l=0;// int r=nums.length-1;// return nums[(l+r)/2];// }// }class Solution { // O(n),O(1) .原创 2021-01-08 19:59:12 · 41 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润
class Solution { public int maxProfit(int[] prices) { int minPrice =Integer.MAX_VALUE; int Profit=0; for(int cur:prices){ if(cur<minPrice){ minPrice=cur; }else if(cur-minPrice>Profi.原创 2021-01-07 21:18:13 · 36 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题
class Solution { // 动态规划,空间复杂度O(1) public int numWays(int n) { if(n==0||n==1){ return 1; } if(n==2){ return 2; } int a=1; int b=2; int sum=0; for(int i=3;i<.原创 2021-01-07 20:26:36 · 66 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
class Solution { // 不额外使用数组,空间复杂度O(1)。 public int[] spiralOrder(int[][] matrix) { if(matrix.length==0){ return new int[0]; } int count=0; int[] res=new int[matrix.length*matrix[0].length]; int l=.原创 2021-01-07 20:02:44 · 44 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
class Solution { public int maxSubArray(int[] nums) { int[] dp=new int[nums.length]; dp[0]=nums[0]; int res=nums[0]; for(int i=1;i<nums.length;i++){ if(dp[i-1]>0){ dp[i]=dp[i-1]+nums[i].原创 2021-01-07 17:19:49 · 40 阅读 · 0 评论 -
剑指 Offer 56 - II. 数组中数字出现的次数 II
class Solution { // 32位,每一位上把数组中数字该位上和相加,每一位结果模3,只出现一次的数字在对应为上因为无法整除,所以为1。 // 将结果串起来,注意位运算细节 public int singleNumber(int[] nums) { int[] counts=new int[32]; for(int cur:nums){ for(int i=0;i<32;i++){ .原创 2021-01-07 16:37:21 · 49 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数
class Solution { // 注意位运算符优先级很低,每次把括号加上 // 如果只有一个数出现了1次,别的都两次,那么全员异或即可 // 两个的话必须分为两组,保证出现一次的数各在一组 // 以这两个数不相同的位来分。其他各出现两次的自动归入这两组。 // 然后两组各自异或即可 // 注意0^别的数还是别的数 public int[] singleNumbers(int[] nums) { int n=0; .原创 2021-01-07 15:32:58 · 74 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
class Solution { // 二分法,每次比较当前值是否为下标值,若是,区间右移,若不是,区间左移。直到跳出循环 public int missingNumber(int[] nums) { int l=0,r=nums.length-1; while(l<=r){ int n=(l+r)/2; if(nums[n]==n){ l=n+1; .原创 2021-01-07 15:06:37 · 67 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
class Solution { // 二分法,两次二分,分别找到左右边界(第一个小于的数和第一个大于的数,相减在减一) // 或者找target和target-1的右边界,一个函数复用两次。 public int search(int[] nums, int target) { if(nums.length==0||target<nums[0]||target>nums[nums.length-1]){ return 0; .原创 2021-01-07 11:00:05 · 63 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符
// class Solution {// // 不够优雅// public char firstUniqChar(String s) {// HashMap<Character,Integer> map=new HashMap();// char[] words=s.toCharArray();// for(char c:words){// if(!map.containsKey(c)){/.原创 2021-01-07 00:08:12 · 93 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
class Solution { public int[][] findContinuousSequence(int target) { List<int[]> res=new ArrayList(); int l=1,r=2; while(l<r){ // 求和公式 int sum=(l+r)*(r-l+1)/2; if(sum==target){ .原创 2021-01-06 23:50:56 · 52 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
class Solution { public int[] twoSum(int[] nums, int target) { int l=0; int r=nums.length-1; while(l<r){ long temp=(long)nums[l]+nums[r]; if(temp==target){ return new int[]{nums[l],num.原创 2021-01-06 23:21:48 · 57 阅读 · 0 评论