剑指offer67题-No47.求1+2+3+…+n
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 用短路特性求解。 int Sum_Solution(int n) { n && (n = n + Sum_Solution(n-1)); return n; }
2025-6-02 15:24
|
|
2025-6-02 15:24
剑指offer67题-No46.孩子们的游戏(圆圈中最后剩下的数)
法1:约瑟夫环递归 n个数相后去掉第m个数,还剩下n−1个数,依然要继续去掉第m个数。由此,从(n,m)的问题变成了(n−1,m)的子问题。时间复杂度和空间复杂度都是On 说实话不理解,先背住吧 int f(int n,int m){ if(n == 1) return 0; else return (f(n-1,m) + m) % n; } in…
2025-6-02 15:23
|
|
2025-6-02 15:23
剑指offer67题-No41-42.和为S的连续正数序列、和为S的两个数字
双指针算法。 法1:直接枚举,从头到尾枚举区间,记录出某段区间的值,如果值==sum,把这段区间的值加入res中。时间复杂度为On√n(n根号n)。因为内层判断不会超过√n次(1+2+3+...+√n > n)。因此空间复杂度为O√n。 vector<vector<int> > FindContinuousSequence(int…
2025-6-02 15:17
|
|
2025-6-02 15:19
剑指offer67题-No40.数组中只出现一次的数字
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 异或、位运算。 有一个简化版的题目: 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。…
2025-5-30 14:48
|
|
2025-5-30 14:48
剑指offer67题-No38-39.二叉树的深度、平衡二叉树
No38:二叉树的深度 简单递归或者层次遍历 class Solution { public: int maxDeep = 0; int curDeep = 0; void dfs(TreeNode* root){ if(root == nullptr) return; curDeep++; maxDeep = max(curDeep, maxDe…
2025-5-30 14:44
|
|
2025-5-30 14:45
剑指offer67题-No37.第一个只出现一次的字符
用两个二分板子,分别是找左边界和右边界的二分。 class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param k int整型 * @return int整型 */ int GetNumberOfK(…
2025-5-30 14:42
|
|
2025-5-30 14:42
剑指offer67题-No36.两个链表的第一个公共节点
双指针算法 法1: 计算 List1 和 List2 的长度 len1 和 len2。 让较长的链表的指针先走 |len1 - len2| 步。 然后两个指针一起走,直到相遇或到达 NULL。 struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode*…
2025-5-30 14:41
|
|
2025-5-30 14:41
剑指offer67题-No35.数组中的逆序对
归并排序 在合并数组的时候,当发现右边的小于左边的时候,此时可以直接求出当前产生的逆序对的个数。可以参考acwing的题解:AcWing 788. 【算法基础课】逆序对的数量(归并排序) - AcWing #include <vector> class Solution { public: long long merge(vector<…
2025-5-30 14:40
|
|
2025-5-30 14:40