【刷题笔记/剑指Offer】Part 3 (21-30)

剑指offer刷题详细分析:part7:31题——35题 目录 Number31:整数中1出现的次数(从1到n整数中1出现的次数) Number32: Number33: Number34: Number35: 题目31 整数中1出现的次数(从1到n整数中1出现的次数)   题目描述:求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,... 阅读详情

21. 栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

好吧,这个题目之前见过,但是这次遇到还是想不出来。。总之,思路是构建一个栈模仿题目操作,另外需要两个指针分别指向压入序列和弹出序列。压入序列指针和弹出序列指针初始分别指向两个序列的头部,按顺序循环压入元素,在循环体中若压入序列指针指向的元素和弹出序列指向的元素相同,则栈执行弹出操作。最后如果栈为空,则表明序列二是序列一的弹出序列,否则不是。代码如下:

import java.util.*;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
       if(pushA.length == 0 || popA.length == 0)
           return false;
        Stack<Integer> stack = new Stack<Integer>();
        int j = 0;
        for(int i = 0; i < pushA.length; i++) {
            stack.push(pushA[i]);
            while(j < popA.length && stack.peek() == popA[j]) {
                stack.pop();
                j++;
            }
        }
        return stack.isEmpty();
    }
}

22. 从上往下打印二叉树

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

这个题目其实就是变相考察二叉树的广度优先遍历,需要用队列辅助完成操作,代码没什么问题,只不过通过这次也顺便熟悉了 java.util  .Queue/.Deque 的常用操作和区别:

1. Queue

主要操作 boolean add(): 在队列末尾加入元素,若成功返回true,不成功抛出异常

              boolean offer():在队列末尾加入元素,若成功返回true,不成功返回false

              E remove():移除队列头的元素,若成功返回元素,不成功抛出异常

              E pull():移除队列头的元素,若成功返回元素,不成功返回null

2. Deque

这个就比较有意思了,它的学名叫做双端队列,既可以当队列用,也可以当栈用,注意这里用add或offer这类队列操作时是向其尾部插入元素,用remove或pull时是移除其头部元素,当用push这样的栈操作时是向其头部插入元素,用pop时是移除其头部元素。所以总结起来:用Deque的时候如果把它当成栈记住是在队列的头进行操作的,一定注意不要用错操作指令,不然很可能像我今天这样,找了半天还是找不到bug,那就蛋疼了。。。

最后,1和2只是接口,当用的时候要这么初始化:

Deque<Integer> deque = new LinkedList<Integer>();
恩,最后附上题目的代码:

import java.util.*;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(root == null)
            return list;
        Deque<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        while(!queue.isEmpty()){
            TreeNode tmp = queue.pop();
            if(tmp.left != null)
            	queue.add(tmp.left);
            if(tmp.right != null)
                queue.add(tmp.right);
            list.add(tmp.val);
        }
        return list;
    }
}

23. 二叉搜索树的后续遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
讲真,这题我想了半天想仿照21的解法一样利用栈来模仿后续遍历过程,然后进行对照,但是最后还是没想出来,牛客网上大神的解法让我茅塞顿开:

【Quote】BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义 : ) 。

所以,找你找这个思路,代码如下:

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length == 0)
            return false;
        return VerifySquenceofBST(0, sequence.length - 1, sequence);
    }
    public boolean VerifySquenceofBST(int start, int end, int [] sequence) {
        if(start >= end)
            return true;
        int root = sequence[end], i = start;
        for(; i < end; i++) {
            if(root < sequence[i])
                break;
        }
        for(int j = i; j < end; j++) {
            if(root > sequence[j])
                return false;
        }
        return VerifySquenceofBST(start, i - 1, sequence) && VerifySquenceofBST(i, end - 1, sequence);
    }
}

24. 二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
好吧,我承认我看了其他大牛的解答才想通的。。。
收获如下: 要想在一个class里访问变量,需要在class里定义变量。 代码如下:
import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    ArrayList<ArrayList<Integer>> path = new ArrayList<ArrayList<Integer>>();
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        if(root == null)
            return path;
        int[] tmp = new int[1000];
        int index = 0;
        isPath(root, target, tmp, index);
        return path;
    }
    private void isPath(TreeNode root, int target, int[] tmp, int index) {
        if(root == null)
            return;
        target -= root.val;
        tmp[index] = root.val;
        index++;
        if(target == 0 && root.left == null && root.right == null) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            for(int i = 0; i < index; i++) {
                list.add(tmp[i]);
            }
            path.add(list);
            return;
        }
        if(target > 0) {
            if(root.left != null)
         	   isPath(root.left, target, tmp, index);
        	if(root.right != null)
                isPath(root.right, target, tmp, index);
        }
        return;
    }
}

25. 复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
这个题目真是让我纠结。。有三种解法:
1. 用临时数组记录每个节点random指针指向第几个节点,这样每次都要从头索引,算法复杂度很高,空间复杂度也很高。
2. 用hashmap来保存节点和random节点的对应关系,空间复杂度比较大
    hashmap是常用的数据结构,用法一定要熟悉。
3. 不新开辟空间
    a. 先复制自己由A->B->C->D到A->A'->B->B'->C->C'->D->D'
    b. 复制random指针
    c. 拆开两个链
但是自己写了程序总是报错,在IDE里调好但是在牛客网提交总是出问题,贴出来大家看看哪里有毛病求指正:
/*
public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}
*/
public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead == null)
            return null;
        RandomListNode p = pHead;
        while(p != null) {
            RandomListNode tmp = new RandomListNode(p.label);
            tmp.next = p.next;
            p.next = tmp;
            p = tmp.next;
        }
        p = pHead;
        while(p != null) {
            if(p.random != null)
            	p.next.random = p.random.next;
            p = p.next.next;
        }
        p = pHead;
        RandomListNode n = p.next;
        RandomListNode tmp = n;
        while(tmp.next != null) {
            p.next = tmp.next;
            p = p.next;
            tmp.next = p.next;
            tmp = tmp.next;
        }
        return n;
    }
}

26. 数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

考虑到数组的特点:在数组中出现次数超过一半,在遍历胡组的时候保存两个值:一个是数组中的一个数字,一个是次数。当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1;如果下个数字和之前 保存的数字不同的话,则次数减1。如果次数为0,我们需要保存下一个数字,并把次数设置为1。由于我们要找的数字肯定是最后一次把次数设为1时对应的数字。再最后,验证该数字是否符合要求即可:

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if(array.length == 0)
            return 0;
        int tmp = array[0];
        int count = 1;
        for(int i = 1; i < array.length; i++) {
            if(count == 0){
                tmp = array[i];
                count++;
            }else{
                if(tmp == array[i])
                    count++;
                else{
                    count--;
                }
            }
        }
        if(!Check(array, tmp))
            tmp = 0;
        return tmp;
    }
    public boolean Check(int[] array, int tmp) {
        int count = 0;
        for(int i = 0; i < array.length; i++) {
            if(tmp == array[i])
                count++;
        }
        boolean isMoreThanHalf = true;
        if(count * 2 <= array.length)
            isMoreThanHalf = false;
        return isMoreThanHalf;
    }
}

27. 最小的K个数

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
所以,这道题目有的说要用冒泡算法的思想,有的说要用堆排列的思想,当然了,这个只需要排列前k个数就ok,所以算法时间复杂度是O(N*K),anyway,代码如下:
import java.util.ArrayList;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> array = new ArrayList<Integer>();
        if(input.length < k)
            return array;
        for(int i = 0; i < k; i++) {
            for(int j = 0; j < input.length - i - 1; j++) {
              	if(input[j] < input[j + 1]) {
                    int tmp = input[j];
                    input[j] = input[j + 1];
                    input[j + 1] = tmp;
                }
            }
            array.add(input[input.length - 1 - i]);
        }
        return array;
    }
}

28. 连续子数组的最大和

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?
动态规划问题,题意指的不一定是从array头开始,可以从中间开始最大的数,代码如下,比较巧妙:
public class Solution {
    public static int FindGreatestSumOfSubArray(int[] array) {
        if(array == null || array.length == 0){
            return 0;
        }
        int currSum = 0;
        int maxSum = array[0];
        for (int j=0 ;j<array.length;j++){
            if (currSum >= 0){
                currSum += array[j];
            }else {
                currSum = array[j];
            }
            if (currSum > maxSum){
                maxSum = currSum;
            }
        }
        return maxSum;
    }
}

29. 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

递归方法解题思路:
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null)
            return null;
        if(pRootOfTree.left == null && pRootOfTree.right == null)
            return pRootOfTree;
        TreeNode left = Convert(pRootOfTree.left);
        TreeNode p = left;
        while(p != null && p.right != null)
            p = p.right;
        if(left != null) {
            p.right = pRootOfTree;
            pRootOfTree.left = p;
        }
        TreeNode right = Convert(pRootOfTree.right);
        if(right != null) {
            pRootOfTree.right = right;
            right.left = pRootOfTree;
        }
        return left != null ? left : pRootOfTree;
    }
}

30. 字符串的排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。

输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

讲真,这题目我知道用的是全排列,但是加上输入描述之后有点方。字符只包括大小写字母,那么也就是说A和a也要按一定顺序输出吗?
anyway,让我们带着问题先来看看普通的全排列。全排列问题是比较经典的问题,用递归的方法比较普遍,设有 N 个元素,那么流程也就是:
1. 交换队列头和后面元素的位置,注意这里队列头也要和自己交换,这样才不会忽略情况
2. 对后面的队列进行 N-1 全排列
3. 。。。。。。
递归进行直到剩下一个元素的时候,一个元素的全排列就是自己。附上全排列code:
package algorithms;

public class Permutation {
	public static void permutation(String array) {
		if (array.length() == 0 || array == null) {
			return;
		}
		permutation(array.toCharArray(), 0, array.length() - 1);
	}
	public static void permutation(char[] array, int start, int end) {
		if(end == start) {
			for(int i = 0; i < array.length; i++) {
				System.out.print(array[i] + " ");
			}
			System.out.println();
		}else {
			for(int i = start; i <= end; i++) {
				swap(array, start, i);
				permutation(array, start + 1, end);
				swap(array, start, i);
			}
		}
	}
	public static void swap(char[] array, int i, int j) {
		if(i != j) {
			char tmp = array[i];
			array[i] = array[j];
			array[j] = tmp;
		}
	}
	public static void main(String[] args) {
		String string = "abc";
		permutation(string);
		
	}
}
大家如果还想知道其他解法,请参考:http://www.jb51.net/article/69939.htm



下面看到这个题目,要考虑到剔除重复元素,那么参考大神们的解法可以用已有的 set 来进行存储队列,这样有重复的排序可以自动删除。下面贴上大神代码供大家膜拜:
import java.util.*;
public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> re = new ArrayList<String>();
        if (str == null || str.length() == 0) {
            return re;
        }
        HashSet<String> set = new HashSet<String>();
        fun(set, str.toCharArray(), 0);
        re.addAll(set);
        Collections.sort(re);
        return re;
    }
    void fun(HashSet<String> re, char[] str, int k) {
        if (k == str.length) {
            re.add(new String(str));
            return;
        }
        for (int i = k; i < str.length; i++) {
            swap(str, i, k);
            fun(re, str, k + 1);
            swap(str, i, k);
        }
    }
    void swap(char[] str, int i, int j) {
        if (i != j) {
            char t = str[i];
            str[i] = str[j];
            str[j] = t;
        }
    }
}




剑指offer刷题详细分析:part11:51题——55题 目录 Number51: Number52: Number53: Number54:字符流中第一个不重复的数字 Number55: 题目54   题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。   输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。 方法1:使用HashMap实现 (不推荐)   分析:最直观的... 阅读详情

相关推荐

论文理解【LLM-OR】——【Step-Opt】Training LLMs for Optimization Modeling via Iterative Data Synthesis and

本文提出 Step-Opt-Instruct 方法,针对用 LLM 做 OR 问题求解任务,用迭代问题生成 + 分步验证机制实习更可靠的训练数据合成,从而微调开源 LLM 得到 Step-Opt。在多个 OR 建模基准提升性能,尤其在复杂问题上提升更明显

佚失的诗篇 806

啊哈C语言 第三章 【代码】【习题答案】

使用的开发工具是VS2019; 代码参考书籍为《啊哈C语言!逻辑的挑战》; 博文中包括文章和课后习题的答案并配有GIF图能更直观看到输出效果;

FangWenJing150的博客 5028

一个基于ZYNQ、AXI接口的PL端卷积加速器,可由PS端调用(附Github源码)

一个基于ZYNQ,AXI接口的PL端卷积加速器,可由PS端调用开发板型号:Zynq-7000 SoC XC7Z305 FPGA开发平台:Vivado 2019.1;Github源码链接:https://github.com/CY0807/ZYNQ_PL_CONV_ACC。

跳跳骑士的博客 1306

用选择法从大到小排序

选择法的特点: 将两个相邻的元素相比,比较它们的大小。 //举例:用选择法将八个整数从大到小排序 #include<stdio.h> #define N 8 int main() { int arr[N]; int i,j,max,tem; printf("请输入八个整数:\n"); for (i = 0; i < N; i++) { printf("arr[%d]=", i); scanf_s("%d", &arr[i]); } printf("\n"

m0_62627340的博客 2401

保姆级教程:手把手配置MAX9295/9296 GMSL2-CSI2链路,搞定4LAN/1LAN模式与常见调试

本文提供MAX9295/9296 GMSL2-CSI2链路的详细配置教程,涵盖4LAN和1LAN模式的硬件连接、寄存器配置及调试技巧。通过实战案例和代码示例,帮助开发者快速实现高带宽视频传输,解决常见问题如信号同步和功耗优化,适用于车载摄像头和机器人视觉系统开发。

weixin_42561143的博客 434

Hadoop与Kafka集群部署与优化实践指南

分布式系统是现代大数据处理的核心架构,其中Hadoop作为分布式存储与计算框架,Kafka作为分布式消息队列系统,共同构成了实时数据处理的基础设施。通过HDFS实现海量数据存储,结合YARN进行资源调度,而Kafka则保障了数据流的实时传输与高吞吐。这种技术组合在电商用户行为分析、物联网数据采集等场景中表现卓越。部署过程中需关注硬件资源配置、关键参数调优以及集群监控方案,例如通过调整HDFS块大小和Kafka partition数量来优化性能。合理运用Flume、Spark Streaming等工具可实现系

weixin_29061997的博客 362

59、【图+树】最小生成树(BST)问题——Prim算法和Kruskal算法(C/C++版)

一、介绍 最小生成树是 设图中节点数为n,边数为m。 当存储的图为稠密图时,常用朴素Prim算法O(n2);当存储的图为稀疏图时,常用Kruskal算法O(m log2m)。

STAR GAME 2513

Flotherm XT新手必看:5分钟搞定自然对流热仿真(附案例文件)

本文为Flotherm XT新手提供了自然对流热仿真的快速入门指南,通过详细的步骤解析和实用技巧,帮助用户在5分钟内完成从建模到后处理的全流程。重点介绍了环境设置、几何建模、材料属性、网格划分等关键环节,并附有案例文件供参考学习,助力工程师快速掌握热仿真技术。

weixin_30839881的博客 630

《剑指Offer》笔记&题解&思路&技巧&优化_Part_7

🟢1. LCR 179. 查找总价格为目标值的两个商品 🟢2. LCR 180. 文件组合 🟢3. LCR 181. 字符串中的单词反转 🟢4. LCR 182. 动态口令 🔴5. LCR 183. 望远镜中最高的海拔 🟡6. LCR 185. 统计结果概率 🟢7. LCR 186. 文物朝代判断 🟢8. LCR 187. 破冰游戏 🟢8. LCR 187. 破冰游戏 🟡9. LCR 188. 买卖芯片的最佳时机 🟡10. LCR 189. 设计机械累加

这里有一只小马吖 1671

【DRAM存储器十五】DDR介绍-关键技术之DLL和prefetch

详述DDR DLL和预取原理以及几个DDR相对初代SDRAM新增的时序参数

highman110的博客 4371

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1905

剑指offer刷题详细分析:part3:11题——15题

题目11 二进制中1的个数   题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 方法1:采取每一位与1然后右移的方法(推荐)   说明:使用无符号右移,不管输入的数是正数还是负数,都使用无符号右移,最高位都会补0。如果采用有符号的右移,负数最高位补1,导致while循环陷入死循环。 public static int NumberOf1_1(int n) { ...

LKJgdut的博客 336

uniapp [全端兼容] - 详细实现人脸识别和活体检测功能,实时监测人脸是否进入区域及动作是否正确播报,免费自动提示引导动作及语音,提供提供实名认证、身份证识别、人脸信息采集、刷脸扫脸认证示例代码

uniapp,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,人脸识别,扫脸认证,人脸认证,活体认证,身份认证,uni-app人脸识别详细教程,如何在app端实现免费人脸识别教程,如何在小程序端做,最好用的插件,安卓ios百度人脸识别、活体检测、人脸采集APP,H5人脸识别带前后摄像头,适合新手看的人脸识别功能教程,详细示例代码源码,有没有免费的,接入百度,阿里云人脸识别,百度,api,活体检测,数据采集,动作提示指引,语音提示指引,报错,无法核验一直出错,根本用

🏆 前端领域优质创作者 1万+

《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_3

1. LCR 138. 有效数字——表示数值的字符串 2. LCR 139. 训练计划 I——调整数组顺序使奇数位于偶数前面 3. LCR 140. 训练计划 II——链表中倒数第k个节点 4. LCR 141. 训练计划 III——反转链表 5. LCR 142. 训练计划 IV——合并两个排序的链表 6. LCR 143. 子结构判断——树的子结构 7. LCR 144. 翻转二叉树 8. LCR 145. 判断对称二叉树 9. LCR 146. 螺旋遍历二维数组 10. LCR 147. 最小栈

这里有一只小马吖 1359

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

剑指offer刷题详细分析:part5:21题——25题

目录 Number21: Number22:从上往下打印二叉树 Number23: Number24: Number25: 题目22   题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。   分析:这是二叉树的层序遍历(广度优先遍历),我们使用一个队列来辅助。 public ArrayList<Integer> PrintFromTopToBottom(T...

LKJgdut的博客 498

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

《剑指Offer》笔记&题解&思路&技巧&优化 Java版本——新版leetcode_Part_4

1. LCR 148. 验证图书取出顺序——栈的压入、弹出序列 2. LCR 149. 彩灯装饰记录 I——从上到下打印二叉树 3. LCR 150. 彩灯装饰记录 II 4. LCR 151. 彩灯装饰记录 III 5. LCR 152. 验证二叉搜索树的后序遍历序列 6. LCR 153. 二叉树中和为目标值的路径 7. LCR 154. 复杂链表的复制 8. LCR 155. 将二叉搜索树转 9. LCR 156. 序列化与反序列化二叉树 10. LCR 157. 套餐内商品的排列顺序

这里有一只小马吖 1608

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

剑指offer刷题详细分析:part10:46题——50题

题目50 数组中重复的数字   题目描述:   在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 方法1:从第一个数字开始,对比后面的数字进行查找   这是最笨的方法,就是从第一...

LKJgdut的博客 873

《剑指Offer》笔记&题解&思路&技巧&优化_Part_6

🟡1.LCR 168. 丑数 🟢2. LCR 169. 招式拆解 II 🔴3. LCR 170. 交易逆序对的总数 🟢4. LCR 171. 训练计划 V 🟢5. LCR 172. 统计目标成绩的出现次数 🟢6. LCR 173. 点名 🟢7. LCR 174. 寻找二叉搜索树中的目标节点 🟢8. LCR 175. 计算二叉树的深度 🟢9. LCR 176. 判断是否为平衡二叉树 🟡10. LCR 177. 撞色搭配 🟡11. LCR 178. 训练计划 VI

这里有一只小马吖 1158

剑指offer刷题详细分析:part6:26题——30题

目录 Number26: Number27: Number28: Number29: Number30:连续子数组的最大和 题目30 连续子数组的最大和   题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负...

LKJgdut的博客 286

剑指offer刷题详细分析:part2:6题——10题

目录 Number6:旋转数组的最小数字 Number7: Number8: Number9: Number10: 题目6 旋转数组的最小数字   题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的...

LKJgdut的博客 360

剑指offer刷题详细分析:part1:1题——5题

题目1 二维数组查找   题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。   分析:如下图,我们知道,只能从左下角或者从右上角入手,输入的数大于当前数就往右走,小于当前的数就往上走。   我们从左上角开始遍历,代码如下: public...

LKJgdut的博客 394

剑指offer刷题详细分析:part8:36题——40题

目录 Number36: Number37: Number38: Number39: Number40:数组中只出现一次的数字 题目40   题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 方法1(推荐)   首先,对于异或运算,有如下规则: a^a = 0; a^0 = a; a^b^c = a^(b^c) = (a^b)^c...

LKJgdut的博客 393

剑指offer刷题详细分析:part9:41题——45题

目录 Number41: Number42:和为S的2个数字 Number43: Number44: Number45: 题目42   题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。   输出描述:对应每个测试案例,输出两个数,小的先输出。   分析:可以使用暴力遍历法(O(n^2)),不推荐...

LKJgdut的博客 470

剑指offer刷题详细分析:part13:61题——67题

目录 Number61: Number62:二叉搜索树的第k个结点 Number63: Number64: Number65: Number66: Number67: 题目62   题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。   分析:二叉搜索树具有左小右大的有序特性,对它进行中序遍...

LKJgdut的博客 749

剑指Offer刷题记录 - part one(python版本)

剑指offer刷题1. 二维数组中的查找题目要求代码 1. 二维数组中的查找 题目要求 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 代码 # -*- coding:utf-8 -*- class Solution: # array 二维列表 def Find(self, target, array): # write code

Liaojiajia-Blog 435

LeetCode 剑指Offer 数据结构之 链表 总结 Part1

LeetCode 剑指Offer 数据结构之 链表 总结 Part1 链表类的题目往往涉及到双指针(快慢),辅助栈,哈希表,递归等算法 剑指Offer中涉及到6道题,文本进行总结: 链表的类定义: class ListNode: def __init__(self, x): self.val = x self.next = None # 有时候还有不止一个链接 此时可以类比为二叉树,图等结构 第一题: https://leetcode-cn.com/

mimazitx的博客 232
上一篇: win10 安装 ubuntu kylin 15 双系统
下一篇: 格雷码生成【grey code】
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值