zoukankan      html  css  js  c++  java
  • 倒数第几个(本质上是将倒数 转化成(两个点之间)具体的距离)

    倒数第几个(本质上是将倒数 转化成(两个点之间)具体的距离)

    1、19_删除链表的倒数第N个结点:

        // 方法三: 通过 设置两个距离是n 的指针(不断的往后走,走到最后,差距便是倒数
        //本质上是将倒数 转化成(两个点之间)具体的距离,而这距离是需要通过遍历到达的

        // 方法三: 通过 设置两个距离是n 的指针(不断的往后走,走到最后,差距便是倒数
        //本质上是将倒数 转化成(两个点之间)具体的距离,而这距离是需要通过遍历到达的
        class Solution3 {
            public ListNode removeNthFromEnd(ListNode head, int n) {
                ListNode dummy = new ListNode(0, head);
                ListNode first = head;
                ListNode second = dummy;
                for (int i = 0; i < n; ++i) {
                    first = first.next;
                }
                while (first != null) {
                    first = first.next;
                    second = second.next;
                }
                second.next = second.next.next;
                ListNode ans = dummy.next;
                return ans;
            }
        }

    2、530_二叉搜索树的最小绝对差:

    编程里要有思维:距离、差(是两个点或者两个数据之间的事)

    二叉树求最小绝对值(两个结点的数据)差(距离)

    ~其实就是转化成了求二叉树中找到两个点的数据是在所有数据中最小的

    本质是数据的关系,无关形态,咱需要拿到二叉树的数据(遍历)~然后题目要求要找出两个数据之间的差最小,这目标就变成了:如果处理数据?

    可以进行升序处理,两个数据挨得近,差值越小,而且刚好升序符合 二叉树的遍历(即拿数据的时候,同时用一定规则(升序)处理数据,从而获得结果)

    (1)差:首先要有两个数据啦,而遍历肯定是先一开始才拿到一个数据,所以咱要通过某种条件得知才拿到一个数据,不立马进行比较,同时记录“第一次”(前次数据),留给“”第二次”(当前数据)进行比较得出一个差值。

    (2)过程中也是不断比较,更新差值:【补充一下:为啥不之间将题目给的接口,套用中序遍历的模式,而是另外再封装一个接口】:

    (3)首先 尽量一个接口的方法名(名如其功能),其次,该方法若是 套用了中序的遍历模式的同时,中序用到的递归(这就彻底翻车了,函数功能很重要呀,递归之后的返回值表明不符题意了

    (4)最后是,辅助变量(前一个结点的数据),若是写在了题意给的接口里,导致 无法区分开,中序遍历才刚刚开始,才刚刚拿到第一个结点数据(虽然也可以解决:通过定义为全局变量)

    (5)最最后,结果变量,若是在题意给的接口里使用中序遍历,最后得到了一个结果的返回(。。。。。其实也有点挺麻烦的)

    官网代码:

        
        //从第二个结点开始,每次进入一个新的结点,都要不断的更新最小距离(同时咱还要好好利用中序的特点就是从小到大排序的呀,当前结点的加入得出的新最小值只需要跟前面一个进行对比即可)
        int prev;
        int ans;
        public int getMinimumDifference(TreeNode root) {
            prev = -1;
            ans = Integer.MAX_VALUE;
            inorder(root);
            return ans;
        }
        //通过拿到前一个的val ,第二个val 减掉即可得知最小的
        public void inorder(TreeNode node) {
            if(node == null)    return;
            inorder(node.left);
            //拿到当前结点,需要判断一下是否遍历到第二个结点了
            if(prev == - 1) {    //才遍历到当前第一个结点
                prev = node.val;
            }else {
                ans = Math.min(ans, node.val - prev);
                prev = node.val;
            }
            inorder(node.right);
            
        }
  • 相关阅读:
    400多个开源项目以及43个优秀的Swift开源项目-Swift编程语言资料大合集
    iOS开发-OC分支结构
    iOS开发-OC数据类型
    const volatile同时限定一个类型int a = 10
    详细解说Tomcat 设置虚拟路径的几种方法及为什么设置虚拟路径
    MySQL5.7数据库的基本操作命令
    CentOS7下搭建LAMP+FreeRadius+Daloradius Web管理
    Python安装第三方库的两种方式
    如何更换CentOS6的yum源
    CentOS6.5下搭建LAMP+FreeRadius+Daloradius Web管理和TP-LINK路由器、H3C交换机连接,实现,上网认证和记账功能
  • 原文地址:https://www.cnblogs.com/shan333/p/15449953.html
Copyright © 2011-2022 走看看