
题解思路
经典题型的解题思路
羊驼儿
菜鸟上路
展开
-
C++:合并两个有序数组
题目描述:给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]示例 2:输入:nums1原创 2021-04-11 21:34:51 · 6349 阅读 · 0 评论 -
C++:删除有序数组中的重复项
题目描述:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。示例 2:输入:nums = [0,0,1,1,1,2,2,3,原创 2021-04-11 20:33:11 · 659 阅读 · 0 评论 -
C++:移除元素
题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参作任原创 2021-04-11 20:07:25 · 212 阅读 · 0 评论 -
C++:青蛙跳台阶问题
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21示例 3:输入:n = 0输出:1提示:0 <= n <= 100力扣题目链接点这里题目分析这种题目一般多少都会用到递归的思想,根据题目我们进行分析:设跳上台阶共有f(n)种方法原创 2021-04-02 12:22:03 · 2589 阅读 · 1 评论 -
旋转数组的最小数字
旋转数组的最小数字题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0题目链接点这里方法一:class Solution {public: int minArray(vector<int>&原创 2021-04-01 20:21:24 · 121 阅读 · 0 评论 -
C++:从尾到头打印链表
题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000方法一:遍历链表从尾到头依次输出class Solution {public: vector<int> reversePrint(ListNode* head) { vector<int> array; ListNode*原创 2021-03-31 15:32:36 · 375 阅读 · 0 评论 -
数组中重复的数字
题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000方法一(鸽巢原理):所以我们可以将见到的元素 放到索引的位置,如果交换时,发现索引处已存在该元素,则重复 。充分利用题目条件,长度为 n 的数组原创 2021-03-23 15:34:54 · 204 阅读 · 0 评论 -
字符串最后一个单词的长度
题目描述计算字符串最后一个单词的长度,单词以空格隔开输入描述:输入一行,代表要计算的字符串,非空,长度小于5000。输出描述:输出一个整数,表示输入字符串最后一个单词的长度。示例输入hello nowcoder输出8牛客网题目链接在这里方法一:这个题目是要求我们计算字符串中最后一个单词的长度,拿到题目后,首先想到的是从后向进行遍历,使用count进行计数,遇到第一个(最后一个单词)空格进行停止,那么count种保存的数字就是最后一个单词的长度。其实现代码如下:#原创 2020-12-05 19:55:44 · 1795 阅读 · 0 评论 -
位运算的应用:强大的令人可怕
众所周知,我们学计算机的基础就是二进制和位操作,而位操作的应用又及其的灵活与广泛,又为我们的算法提供了新颖独特的思路。位运算基础位运算符描述运算规则<<左移二进位向左移若干位,高位丢弃,低位补0>>右移二进位向右移若干位,正数高位补0,负数高位补1&位与两个位都为1时才为1l位或两个位都为0时才为0~取反0变1,1变0^异或两个位相同时为0,相异为1位运算符介绍1、<< 左原创 2020-12-03 00:33:47 · 859 阅读 · 0 评论 -
力扣260: 只出现一次的数字iii
题目描述:给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。示例 :输入: [1,2,1,3,2,5]输出: [3,5]注意:结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?力扣题目链接题目分析通过遍历一次的异或运算,所保留得到就是仅出现一次的两个数的异或结果,我们将其标记为bit_mask;(我们这里得到的是异或的结果,不能原创 2020-12-02 20:23:32 · 143 阅读 · 0 评论 -
力扣137:只出现一次的数字ii
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 :输入: [2,2,3,2]输出: 3输入: [0,1,0,1,0,1,99]输出: 99题目思路:我们依然采用位运算,利用异或运算的特殊性质进行求解,这次不同的是其他的数字都出现了三次,我们可以和与运算一起搭配使用进行判断。异或运算:x ^ 0 = xx ^ x = 0与运算:原创 2020-12-02 14:42:13 · 193 阅读 · 0 评论 -
力扣136:只出现一次的数字
题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 :输入: [2,2,1]输出: 1输入: [4,1,2,1,2]输出: 4力扣题目链接题目思路:不使用额外的空间进行统计次数,我们采用位运算进行解决:异或运算有以下三个性质:任何数和0做异或运算结果仍然是原来的数;即:a ^ 0 = a;任何数和自身做异或运算,结果仍然是原来的数,即:a原创 2020-12-02 14:19:05 · 192 阅读 · 0 评论 -
C++:另类加法
class UnusualAdd {public: int addAB(int A, int B) { while(B != 0) { int ret = A ^ B;//对应位的和 B = (A & B) << 1;//对应和的进位 A = ret; } return A; }};原创 2020-12-02 13:50:51 · 317 阅读 · 0 评论 -
求最小公倍数
题目描述正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。输入描述:输入两个正整数A和B。输出描述:输出A和B的最小公倍数。示例1输入5 7输出35题目链接求最小公倍数有多种思路解法:穷举法、辗转相除法等但效率更高更简便的一种求解思路是利用公式:最小公倍数=两数之积/最大公约数#include <iostream>using namespace std;int main(){原创 2020-12-01 11:31:45 · 523 阅读 · 0 评论 -
最大公约数
利用辗转相除法求两个数的最大公约数,其思路如下:求num1/num2的余数令temp= num1%num2之后将num2的值赋给num1再将num1的值赋给temp终止条件是num2不为0#include <iostream>using namespace std;int main(){ int num1, num2; cin >> num1 >> num2; while(num2) { int te原创 2020-12-01 11:31:25 · 138 阅读 · 0 评论 -
反转字符串 II:区间部分翻转
题目要求:给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。·如果剩余字符少于 k 个,则将剩余字符全部反转。·如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。(1.该字符串只包含小写英文字母。2.给定字符串的长度和 k 在 [1, 10000] 范围内。)示例:输入: s = “abcdefg”, k = 2输出: “bacdfeg”在解这道题的过程中,一开始读题目时,便觉得题目有些复杂原创 2020-11-17 09:37:55 · 743 阅读 · 0 评论 -
翻转字符串中的单词
题目要求:给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。示例:输入:“Let’s take LeetCode contest”输出:“s’teL ekat edoCteeL tsetnoc”在做这个题目时,脑海中的第一反应就是采用双指针进行翻转,这样比较快捷方法一:class Solution {public: string reverseWords(string原创 2020-11-17 09:37:39 · 217 阅读 · 0 评论 -
C++:1+2+3+...+n求和
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。题目思路分析思路一:(直接进行求解)这是一个求和题目,看到这个题后,不假思索的直接使用一个for循环即可求和得出答案,但违背了题目中使用循环语句的条件;class Solution {public: int Sum_Solution(int n) { int sum=n; for(int i=1;i<n;+原创 2020-10-19 21:00:07 · 12078 阅读 · 0 评论