剑指offer11-20

文章目录

11.旋转数组的最小数字

肯定不是遍历一遍O(N),这种变相有序,也是二分。二分也不容易啊,要思考。

java 复制代码
public class LC11 {
    public static int minArray(int[] numbers) {
       int i=0,j=numbers.length-1;

       //用 i  和 m比较的问题是,如果没有旋转数组,会输出最后一个数字  而不是第一个数字
        /*
       while(i<j){
           int m=(i+j)/2;
           if(numbers[i]<numbers[m]){
               i=m;
           }else if(numbers[i]>numbers[m]){
               j=m;
           }else{
               i++;
           }
       }
       */
        while(i<j){
            int m=(i+j)/2;
            if(numbers[j]>numbers[m]){
                j=m;
            }else if(numbers[j]<numbers[m]){
                i=m+1;
            }else{
                j--;
            }
        }
       return numbers[i];

    }
    public static void main(String[] args) {
        int[] numbers={3,4,5,1,2};
        int[] numbers1={2,2,2,0,1};
        int[] numbers2={1,2,2};   //因为这种案例,所以在相等的情况下是J--而不是i++
        System.out.println(minArray(numbers));

    }
}

12.矩阵中的路径

java 复制代码
public class LC12 {

    public static void main(String[] args) {
        String word="ABCCED";
        char[][] borad={{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}};

        String word1="abcd";
        char[][] board={{'a','b'},{'c','d'}};
        System.out.println(exist(borad,word));

    }

    public static boolean exist(char[][] board, String word) {
        char[] words=word.toCharArray();
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[0].length;j++){
                if(dfs(board,words,i,j,0)) return true;
            }
        }
        return false;

    }

    public static boolean dfs(char[][] board, char[] word, int i, int j, int k) {
        //如果越界  或者 不相等
        if(i>=board.length || i<0 || j<0 || j>=board[0].length || word[k]!=board[i][j]) return false;
        if(k==word.length-1) return true;
        //将走过的位置置空
        board[i][j]='\0';
        boolean ans=dfs(board,word,i+1,j,k+1) || dfs(board,word,i-1,j,k+1) ||
                dfs(board,word,i,j-1,k+1) || dfs(board,word,i,j+1,k+1);
        board[i][j]=word[k];
        return ans;
    }
}

13.机器人的运动范围

java 复制代码
public class Lc13 {
    public static void main(String[] args) {
        System.out.println(movingCount(2,3,1));

    }
    public static int movingCount(int m, int n, int k) {
        boolean[][] visited = new boolean[m][n];
        return dfs(0, 0, m, n, k, visited);
    }
    public static int dfs(int i,int j,int m,int n,int k,boolean[][]visited) {
        if (i < 0 || i > m - 1 || j < 0 || j > n - 1 || j / 10 + j % 10 + i / 10 + i % 10 > k || visited[i][j]) {
            return 0;
        }
        visited[i][j] = true;
        return 1 + dfs(i, j - 1, m, n, k, visited) + dfs(i, j + 1, m, n, k, visited) + dfs(i - 1, j, m, n, k, visited) + dfs(i + 1, j, m, n, k, visited);
    }
}

所有的dfs都是从每一个点开始,往所有方向遍历,dfs的参数列表还要传一个全局的数组去判断合不合适继续往下走。

15.二进制中1的个数

n&(n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,其余不变。

java 复制代码
public class Solution {
    public int hammingWeight(int n) {
        int res = 0;
        while(n != 0) {
            res++;
            n &= n - 1;
        }
        return res;
    }
}

或者直接调用Integer.bitCount(n)函数详解

16.数值的整数次方

先处理负数,然后要提前处理奇数。其实最后当b==1的时候也要处理奇数。

java 复制代码
class Solution {
    public double myPow(double x, int n) {
        if(x == 0) return 0;
        long b = n;
        double res = 1.0;
        if(b < 0) {
            x = 1 / x;
            b = -b;
        }
        while(b > 0) {
            if((b & 1) == 1) res *= x;
            x *= x;
            b >>= 1;
        }
        return res;
    }
}

17.打印从1到最大的n位数(待写)

18.删除链表的节点

java 复制代码
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        if(head==null) return null;
        if(head.val==val) return head.next;
        ListNode pre=head,cur=head.next;
        while(cur!=null && cur.val!=val){
            pre=pre.next;
            cur=cur.next;
        }
        if(cur!=null) pre.next=cur.next;
        return head;
    }
}

19.正则表达式匹配(好难)

20. 没意义算了

相关推荐
为什么这亚子42 分钟前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
~yY…s<#>1 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
幸运超级加倍~2 小时前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
yannan201903132 小时前
【算法】(Python)动态规划
python·算法·动态规划
埃菲尔铁塔_CV算法2 小时前
人工智能图像算法:开启视觉新时代的钥匙
人工智能·算法
EasyCVR2 小时前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
linsa_pursuer2 小时前
快乐数算法
算法·leetcode·职场和发展
小芒果_012 小时前
P11229 [CSP-J 2024] 小木棍
c++·算法·信息学奥赛
qq_434085902 小时前
Day 52 || 739. 每日温度 、 496.下一个更大元素 I 、503.下一个更大元素II
算法