【lc刷题 day7】二叉搜索树与双向链表 字符串的排列 最小的k个数 连续子数组的最大和 数字序列中某一位的数字 把数字翻译成字符串

news/2024/7/20 20:25:11 标签: 链表, 深度优先, 算法

剑指offer 36.二叉搜索树与双向链表 medium

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val,Node _left,Node _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {
    List<Node> list=new ArrayList<>();
    public Node treeToDoublyList(Node root) {
        if(root==null) return null;
        inorder(root);
        for(int i=0;i<list.size();i++){
            Node node=list.get(i);
            node.left=i==0?list.get(list.size()-1):list.get(i-1);
            node.right=i==list.size()-1?list.get(0):list.get(i+1);
        }
        return list.get(0);
    }
    void inorder(Node node){
        if(node==null) return;
        inorder(node.left);
        list.add(node);
        inorder(node.right);
    }
}

有一点需要注意,就是但root==null的时候,返回null
如果不判断这个边界条件的话通不过
时间复杂度O(n),空间复杂度O(n)

有一个hard题,二叉树的序列化,跳过去了

剑指offer 38.字符串的排序 medium

class Solution {
    public String[] permutation(String s) {
        Set<String> set=new HashSet<>();
        char[] arr=s.toCharArray();
        boolean[] visited=new boolean[arr.length];
        dfs(arr,"",visited,set);
        return set.toArray(new String[0]);
    }
    void dfs(char[] arr,String s,boolean[] visited,Set<String> set){
        if(s.length()==arr.length){
            set.add(s);
            return;
        }
        for(int i=0;i<arr.length;i++){
            if(visited[i]) continue;
            visited[i]=true;
            dfs(arr,s+String.valueOf(arr[i]),visited,set);
            visited[i]=false;
        }
    }
}

dfs的思想
其中 void dfs(char[] arr,String s,boolean[] visited,Set<String> set)
char[] arr为char数组,记录字符串s中每个字符
s为本次dfs的字符串结果
boolean[] visited记录字符是否出现过
Set<String> set是记录结果

剑指offer 39.数组中出现次数超过一般的数字 easy

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

剑指Offer 40.最小的k个数 easy

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        if(arr.length==0) return new int[0];
        quiksort(arr,0,arr.length-1);
        int[] res=new int[k];
        for(int i=0;i<k;i++){
            res[i]=arr[i];
        }
        return res;
    }
    void quiksort(int[] arr,int left,int right){
        int leftIndex=left,rightIndex=right;
        if(left>=right) return;
        int key=arr[left];
        while(left<right){
            while(left<right&&arr[right]>=key){
                right--;
            }
            arr[left]=arr[right];
            while(left<right&&arr[left]<=key){
                left++;
            }
            arr[right]=arr[left];
        }
        arr[left]=key;
        quiksort(arr,leftIndex,left-1);
        quiksort(arr,right+1,rightIndex);
    }
}

写了一个快排,各个排序算法还需要复习一下
时间复杂度O(nlogN),空间复杂度O(logN)

跳过了一个hard,数据流中的中位数

剑指Offer 42.连续子数组的最大和 easy

class Solution {
    public int maxSubArray(int[] nums) {
        int[] dp=new int[nums.length];
        dp[0]=nums[0];
        int max=nums[0];
        for(int i=1;i<nums.length;i++){
            dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
            max=Math.max(dp[i],max);
        }
        return max;
    }
}

动态规划的思想
dp[i]代表以i为结尾的连续子数组的最大和
时间复杂度O(N),空间复杂度O(n)
这道题还有更好的方法,空间复杂度可以简化为O(1)

跳过了一道hard

剑指 Offer 44. 数字序列中某一位的数字

class Solution {
    public int findNthDigit(int n) {
        int digit = 1;
        long start = 1;
        long count = 9;
        while (n > count) { // 1.
            n -= count;
            digit += 1;
            start *= 10;
            count = digit * start * 9;
        }
        long num = start + (n - 1) / digit; // 2.
        return Long.toString(num).charAt((n - 1) % digit) - '0'; // 3.
    }
}

蚌埠住了,好难

剑指 Offer 46. 把数字翻译成字符串 medium

class Solution {
    public int translateNum(int num) {
        String s=num+"";
        int a=1,b=1;
        for(int i=1;i<s.length();i++){
            String substring=s.substring(i-1,i+1);
            if(substring.compareTo("10")>=0&&substring.compareTo("26")<0){
                b=b+a;
                a=b-a;
            }else{
                a=b;
            }
        }
        return b;
    }
}

动态规划的思想
注意string.compareTo()这个函数
时间复杂度O(n),空间复杂度O(1)


http://www.niftyadmin.cn/n/19660.html

相关文章

Android基础学习(二十四)—— View绘制

1、Activity.setContentView Activity.setContentView(layoutResID:int)PhoneWindow.setContentView(layoutResID:int)PhoneWindow.installDecor//mContentParent为DecorViewLayoutInflater.inflate(layoutResID:int, mContentParent:ViewGroup)//attachToRoot为 root ! nullL…

【java】java集合详解

目录一.集合类型二.集合的不同三.List解析1.ArrayList2.LinkedList3.Vector四.Set解析1.HashSet2.TreeSet3.LinkedHashSet五.Map解析1.HashMap2.TreeMap3.HashTable4.ConcurrentHashMap一.集合类型 集合类型和关系(我画的比较简略&#xff0c;其中有很多继承实现关系都没有画),…

函数栈帧(栈区)

函数栈帧&#xff08;栈区&#xff09;一.前言二.main函数空间的开辟&#xff08;函数调用是如何做到的&#xff09;三.main函数内部的变量初始化&#xff08;局部变量是如何创建的以及为什么是随机值&#xff09;四.main函数内部的函数创建1.函数是如何传参的2.传参的顺序以及…

Android -- 每日一问:如何实现自定义View?

经典回答 回忆一下&#xff0c;你去面试时常被问到的自定义 View 方面的问题是那些。有没有&#xff1a; invalidate 和 postInvalidate 方法的区别&#xff1f;自定义 View 的绘制流程&#xff1f;View 的 Touch 事件分发流程&#xff1f; 因为在实际的工作中并不是每个人都…

esp8266测试1.44英寸TFT屏(驱动7735)的demo

参考这教程: 使用esp8266点亮福利屏型号st7735的1.44的TFT屏 管脚连接&#xff1a; 我的用的TFT1.44寸ST7735&#xff0c;与NodeMCU针脚接线成功连接 VCC——3V GND——G LED——3V CLK——D5 SDI——D7 RS——D6 RST——D4 CS——D8 这里给出常用的屏幕管脚定义 以及esp8266…

06---SpringBoot整合MybatisPlus 实现增删改查和分页

1、Mybatis-plus简介 为什么要用MP&#xff1f; MyBatisPlus可以节省我们大量工作时间&#xff0c;所有的CRUD代码都可以自动化完成偷懒用的~如果是对sql语言不太熟练的建议先用mybatis&#xff0c;熟练后再用mybatis-plus 简述 官网https://baomidou.com/为简化开发而生My…

Ajax(JavaWeb-Ajax、跨域等)

1.JavaWeb - Ajax 概念&#xff1a;AJAX&#xff08;Asynchronous Java JavaScript And Xml &#xff09;&#xff1a;异步的JavaScript和Xml AJAX作用&#xff1a; 与服务器进行数据交换&#xff1a;通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 使用…

虚函数与纯虚函数

1. 虚函数与纯虚函数 虚函数&#xff1a;在类成员方法的声明&#xff08;不是定义&#xff09;语句前加virtual关键字&#xff0c;此函数就变成了虚函数。具体如下&#xff1a; virtual void function set_value();... endfunction用途&#xff1a;主要用于实现多态。在父类中…