剑指offer day6
51、数组中的逆序对 https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
回忆一下归并排序,其中在merge操作的时候我们可以很容易的发现逆序对,那么接下来我们利用merge_sort来寻找逆序对。
直接写出merge_sort 模版
1 | class Solution{ |
52、两个链表的第一个公共节点 https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/
首先说一下通用做法,我们直接利用Set
1 | public class Solution { |
但是上述解法效率不高.接下来我们尝试寻求一种效率更高的解法
假设链表A的长度为a,链表B的长度为b,且两者交集的长度为c
即如果有交集的话,a+c+b=b+c+a
如果没有交集 a+b=b+a
1 | class Solution{ |
如果使用三目运算符,代码看起来比较简洁
1 | class Solution{ |
在热评中看到这样一句话: 两个节点不断的在对方的轨迹中寻找对方的身影,只要两人有交集,就终会相遇。
53-1、在排序数组中查找数字 https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/
题目的意思是让统计一个数字在排序数组中出现的位置
我们可以先用二分法查找出左边界,然后右边线性搜索
1 | class Solution{ |
或者我们可以直接利用二分法求出左右边界,然后就可以求出正确答案
1 | class Solution { |
53-2、0~n-1中缺少的数字 https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内
我们可以直接利用二分查找,如果当前某个数,不在自己的位置上,那么在他之前一定发生了缺失。
因为一个递增的排序数组,从0开始,每一个数都应该在自己的索引处。
1 | class Solution { |
54、二叉搜索树的第k大节点 https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/
二叉搜索树的一个极其重要的性质就是其中序遍历是有序的,这里我们可以直接对其进行中序遍历,然后取出第k个大节点,虽然有点浪费,但是是最直接的方式。
1 | class Solution { |
或者不用开O(n)的空间,当找到第k个节点的时候直接返回结果 但是记住这里是第K大,即我们应该对其进行逆序遍历,那么先遍历右子树,然后左子树。
1 | class Solution { |
55-1、二叉树的深度 https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/
BFS求深度
1 | class Solution { |
递归
1 | class Solution { |
55-2 平衡二叉树 https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/
我们自己在实现一颗平衡二叉树时,往往会通过判断两颗子树的高度差来实现,这里前文已经求过了二叉树的深度,我们这里也可以利用求深度.
1 | class Solution { |
56-1、数组中数字出现的次数 https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/
不会位运算,只好使用最笨的办法 ,贴一个计数排序
1 | class Solution { |
首先要知道,如果两个数相等,那么异或为0,根据这个性质我们可以做这一题。
1 | class Solution { |
56-2、数组中数字出现的次数 https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/
暂时不会位运算, 先贴一个map,以后修改
1 | class Solution { |
57、和为s的两个数字 https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/
由于题目给定递增排序那么直接左右指针即可
1 | class Solution { |