手撕代码相关

本文深入解析了LeetCode上的经典算法题目,包括相交链表、判断链表是否有环、反转二叉树、二叉树遍历、最长公共前缀等,提供了Python实现代码,并探讨了动态规划和双指针等高效算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.leetcode 160 python 相交链表

下面的方法比较好理解,感觉都需要事前知道或是推导出这个规律,然后才能写。

###方法1:
class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """
        #把p,q分别指向headA, headB,统计A、B的链表长度
        p, q = headA, headB
        countA = countB = 0
        while p != None:
            p = p.next
            countA += 1
        while q != None:
            q = q.next
            countB += 1
        #把m,n分别指向headA, headB
        m, n = headA, headB
        #如果A比B长,A先从头跳过长出来数
        if countA > countB:
            for i in range(countA - countB):
                m = m.next
        else:
            for i in range(countB - countA):
                n = n.next
        #也就是把长A的前面长出来数跳过,然后从中间某个数开始跟B的head以此比较
        while m != n:
            m = m.next
            n = n.next
        return m

###方法2:
class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """
        p, q = headA, headB
        while p != q:
            q = headB if q is None else q.next
            p = headA if p is None else p.next
        return p

2、判断链表是否有环,找到入环节点–python实现
用快慢指针的方法。时间复杂度O(n),空间复杂度O(1)。
设置p1为慢指针,p2为快指针,两者初始时都指向链表的头结点 ,慢指针p1每次前进1步,快指针p2每次前进2步。如果链表存在环,则快指针p2肯定先进入环,慢指针p1后进入环,两个指针必定会相遇。如果不存在环,则快指针会先行到达链表的尾部变为None。

3. 226反转二叉树
在这里插入图片描述
递归反转

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
 
class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        #递归
        if not root:
            return root
        root.left,root.right=self.invertTree(root.right),self.invertTree(root.left)
        return root

4、二叉树的前中后序、层次遍历
https://www.cnblogs.com/bjwu/p/9284534.html

5.最长公共前缀

最后应该return null?
在这里插入图片描述
在这里插入图片描述

LeetCode 322 零钱兑换 Python
思路如下:
此题可用动态规划求解,类似与背包问题,但每个硬币可用多次
初始化长度为amount+1的列表,除了第一个值为0外其余值均为-1
依次更新dp[i],dp[i]=min(dp[i-coins[j]])+1

《剑指offer》【两个链表的第一个公共结点】(python版)
计算两链表长度m,n;
快指针从较长的链表头先出发,走 | m - n | 步;
慢指针从较短链表头出发,与快指针以同样步长前进,直到两指针相等并且都不为空,即为公共结点
算法只对两链表分别进行两次遍历,时间复杂度为O(n)

2019年11月7日面试字节跳动EE组-北京:
45min笔试题(笔试来自牛客互联面面试真题):
(1)二叉树中序遍历;(2)输入字符串,实现四则运算
一面:
(1)任意四个点,二维数组,判断是不是正方形;
二面:
(1)有序数组的查找,二分;(3)无序数组的查找,要求时间复杂度最优;(2)图的思想,从A能否到D。
三面:
(1)最长不重复字串;(2)二分查找

最长不重复字串-python动态规划(感觉更好理解一些)
最长不重复字串-“双指针”窗口移动思想

### 代码的核心要素 代码是一种常见的技术面试形式,主要用来评估候选人的实际编程能力和逻辑思维水平。以下是几个关键点: #### 1. **编写测试用例的重要性** 在解决算法问题之前,先编写测试用例可以帮助验证解决方案的有效性和边界条件覆盖情况[^2]。通过这种方式,可以在开发过程中及时发现问题并调整策略。 #### 2. **C++ 中的常用技巧** 对于 C++ 开发者来说,掌握一些基础但实用的技术非常重要。例如,在处理字符串转换时可以使用 `strcpy` 函数将标准库中的字符串复制到字符数组中;而在操作多维容器(如二维向量)时,则可以通过以下方式高效地添加元素[^3]: ```cpp // 方法一:逐层构建 res.push_back(std::vector<int>()); res.back().push_back(value); // 方法二:预先填充临时变量后再加入主集合 std::vector<std::vector<int>> nums; std::vector<int> temp_vector; temp_vector.push_back(a); temp_vector.push_back(b); nums.push_back(temp_vector); ``` #### 3. **时间管理与效率提升** 针对一线互联网公司校招场景下的算法题解答过程,通常建议控制每道题目完成时间为 15 分钟以内[^4]。这不仅考验选对经典算法模型的理解程度,还涉及快速分析复杂度的能力以及灵活运用已有知识解决问题的速度。 #### 4. **动态规划优化路径探索** 当面对需要利用动态规划(DP)来求解的问题时,除了基本状态转移方程的设计外,还可以尝试进一步的空间压缩或者记忆化搜索等段来进行性能上的改进[^1]。比如某些特定情况下可以从 O(n²)->O(n) 的存储需求降低至线性级别甚至常数级空间消耗。 --- ### 动态规划实例解析——最大子序列和问题 假设给定一个整型数组arr=[-2,1,-3,4,-1,2,1,-5,4], 要找到其中连续的一段使得其总和达到最大值。 我们可以采用如下DP方法实现: 设dp[i]表示以第i个位置结尾的最大子序和, 则有递推关系:` dp[i]=max(dp[i−1]+num[i], num[i])`. 最终结果即为所有可能取值里的最大那个. 下面是具体实现代码片段: ```c++ #include <iostream> #include <vector> using namespace std; int maxSubArraySum(const vector<int>& nums){ if(nums.empty()) return 0; int current_max = nums[0]; int global_max = nums[0]; for(int i=1;i<nums.size();i++){ current_max=max(current_max+nums[i], nums[i]); global_max=max(global_max,current_max); } return global_max; } int main(){ vector<int> test={-2,1,-3,4,-1,2,1,-5,4}; cout<< "Max Subarray Sum is:"<<maxSubArraySum(test)<<endl; } ``` 上述程序展示了如何有效地计算任意长度输入列表内的最佳累积效果,并且保持了较高的运行效能。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值