NC
fkuner
这个作者很懒,什么都没留下…
展开
-
NC60—判断一棵二叉树是否为搜索二叉树和完全二叉树
题意给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。题解判断搜索二叉树看我之前的文章LeetCode系列98—验证二叉搜索树完全二叉树可以这样来判断:层次遍历直至遇到第一个空节点完全二叉树在遇到空节点之后剩余的应当全是空节点public boolean isCompleteTree(TreeNode root) { Queue<TreeNode> queue = new LinkedList<TreeNode>();原创 2020-12-02 11:32:20 · 218 阅读 · 0 评论 -
NC37—合并区间
题意给出一组区间,请合并所有重叠的区间。题解按照区间的左边界排序,遍历合并即可,代码如下:/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */class Solution原创 2020-12-02 09:16:48 · 468 阅读 · 0 评论 -
NC59—矩阵的最小路径和
题意给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。题解首先,拿到这道题我的第一思路是DFS,但是DFS会有很多重复计算,因此可以用备忘录优化,而往往这类问题都可以用动态规划来解决那么这个动态规划问题的状态转移方程是什么呢?状态很好看出来,就是在矩阵中的位置,看题意从坐上角开始每次只能向右或者向下走,这就是状态转移方程,即每一个矩阵中位置只能从左或者上转移过来dp[i][j]表示矩阵第原创 2020-12-01 20:26:24 · 469 阅读 · 0 评论 -
NC35—最小编辑代价
题意给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。题解典型的动态规划,思路与LeetCode系列72—编辑距离,只是加了一些附加条件改动的只有base case和状态转移方程,详情见代码class Solution {public: /** * min edit cost * @param str1 string字符串 the string * @param原创 2020-12-01 19:55:41 · 248 阅读 · 0 评论 -
NC18—顺时针旋转矩阵
题意有一个 N x N 整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。题解方法一:使用辅助数组原创 2020-12-01 14:03:52 · 2458 阅读 · 0 评论 -
NC81—二叉搜索树的第k个结点
题意给定一棵二叉搜索树,请找出其中的第k小的结点。题解很简单,中序遍历即可,类似的还有这道题剑指Offer系列54—二叉搜索树的第k大节点,将中序遍历反过来,先遍历右子树,再遍历左子树/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {原创 2020-12-01 10:41:25 · 201 阅读 · 0 评论 -
NC133—链表的奇偶重排
题意给定一个单链表,请设定一个函数,讲链表的奇数位节点和偶数位节点分别放在一起,重排后输出。注意是节点的编号而非节点的数值。题解遍历链表,将奇数位节点逐个插入到前面即可cur为奇数位节点指针,pre为cur的前置指针,用来删除cur节点同时使用了一个odd指针来保存已经插入好的奇数位节点详情看代码/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public:原创 2020-12-01 09:21:29 · 215 阅读 · 0 评论 -
NC24—删除有序链表中重复出现的元素
题意给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。题解设置伪结点,方便处理设置双指针prev和curr当遇到当前节点值和下一节点值相等的节点时,进行while循环找到下一个不相等的节点,挂到prev节点上当遇到当前节点值和下一节点值不相等的节点时,prev和curr都移动到下一个节点接着遍历就行//Javapublic ListNode deleteDuplicates(ListNode head) { ListNode dummy = ne原创 2020-11-29 17:43:10 · 1012 阅读 · 1 评论 -
NC128—容器盛水问题
题意给定一个整形数组 arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。题解用两个数组保存左边区域的最大值和右边区域的最大值,计算某个位置的存水量时,用两边区域的最小值减去底部的高即可class Solution {public: /** * max water * @param arr int整型vector the array * @return long长整型 */ long long maxWater(原创 2020-11-29 16:09:33 · 218 阅读 · 0 评论 -
NC50—链表中的节点每k个一组翻转
题意将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。要求空间复杂度 O(1)例如:给定的链表是1→2→3→4→5对于k=2, 你应该返回 2→1→4→3→5对于k=3, 你应该返回 3→2→1→4→5题解这道题是有子问题的,比如翻转第一次 k 个数后,后面的问题跟整个问题一样,所以可以用递归,详情看代码首先实现一个反转整个链表的代码,这里用迭代法实现,当然递归也可以ListNo原创 2020-11-29 12:06:05 · 323 阅读 · 0 评论 -
NC21—链表内指定区间反转
题意将一个链表 m 位置到 n 位置之间的区间反转,要求时间复杂度为O(n)O(n)O(n) ,空间复杂度为O(1)O(1)O(1)例如:给出的链表为1→2→3→4→5→NULL,返回1→4→3→2→5→NULL题解方法一:迭代法将 n 位置之前的元素逐步插入到 n 元素之后/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public: /**原创 2020-11-29 11:37:55 · 415 阅读 · 0 评论 -
NC72—二叉树的镜像
题意操作给定的二叉树,将其变换为源二叉树的镜像题解后序遍历/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: void Mirror(TreeNode *pRoot) { recur(pRoot原创 2020-11-29 10:39:12 · 353 阅读 · 0 评论 -
NC70—单链表的选择排序
题意给定一个无序单链表,实现单链表的选择排序(按升序排序)题解傻了啦叽地按照选择排序步骤,找到最小的元素后,插入到已经有序的链表的最后耗时耗力,需要保存多个指针,而且还超时!!!直接交换值即可,附上我傻了啦叽的代码/** * struct ListNode { * int val; * struct ListNode *next; * }; */class Solution {public: /** * * @param head ListNode类原创 2020-11-29 10:30:24 · 309 阅读 · 0 评论 -
NC36—在两个长度相等的排序数组中找到上中位数
题意给定两个有序数组arr1和arr2,已知两个数组的长度都为 N,求两个数组中所有数的上中位数上中位数:假设递增序列长度为 n,若 n 为奇数,则上中位数为第 n/2+1 个数,否则为第n/2个数[要求]时间复杂度为O(logN)O(logN)O(logN),额外空间复杂度为O(1)O(1)O(1)题解要求时间复杂度为O(logN)O(logN)O(logN),很容易想到二分查找,关键是怎么二分如果每个数组中只有一个元素,较小的那个元素就是整体的上中位数,如果两个元素相等,随便返回哪个都原创 2020-11-29 10:11:48 · 265 阅读 · 0 评论 -
NC48—在转动过的有序数组寻找目标值
题意给出一个转动过的有序数组,你事先不知道该数组转动了多少0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1假设数组中不存在重复项题解不管数组怎么转,都会有一半以上组成的数组是有序的,所以就有了以下解法//Javapublic int search (int[] A, int target) { // write code here int left = 0, right =原创 2020-11-30 09:55:37 · 212 阅读 · 0 评论 -
NC112—进制转换
题意给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数题解class Solution {public: /** * 进制转换 * @param M int整型 给定整数 * @param N int整型 转换到的进制 * @return string字符串 */ string solve(int M, int N) { stack<int> st; st原创 2020-11-30 09:55:54 · 193 阅读 · 0 评论 -
NC121—字符串的排列
题意输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba题解class Solution {public: vector<string> Permutation(string str) { if(str.empty()) return {}; set<string> res; backtrack原创 2020-11-28 13:49:48 · 290 阅读 · 0 评论 -
NC136—输出二叉树的右视图
题意请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图题解#include <unordered_map>class Solution {private: unordered_map<int, int> findIndex; int index; vector<int> res;public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的原创 2020-11-28 11:51:38 · 227 阅读 · 0 评论 -
NC54—数组中相加和为0的三元组
题意给出一个有n个元素的数组S,S中是否有元素a, b, c满足a + b + c = 0?找出数组S中所有满足条件的三元组注意:三元组(a、b、c)中的元素必须按非降序排列(即a ≤ b ≤ c)解集中不能包含重复的三元组。例如,给定的数组 S = {-10 0 10 20 -10 -40}, 解集为(-10, 0, 10) (-10, -10, 20)题解先排序,然后以第一个值为基准开始遍历,用双指针求第二个值和第三个值class Solution {public: vec原创 2020-11-28 11:11:51 · 205 阅读 · 0 评论 -
NC32—求平方根
题意实现函数 int sqrt(int x)计算并返回x的平方根题解class Solution {public: /** * * @param x int整型 * @return int整型 */ int sqrt(int x) { int left = 0; int right = x; while(left <= right){ int mid = lef原创 2020-11-28 10:28:53 · 135 阅读 · 0 评论 -
NC97—出现次数的TopK问题
题意给定String类型的数组strArr,再给定整数k,请严格按照排名顺序打印出次数前k名的字符串。[要求]如果strArr长度为N,时间复杂度请达到O(N \log K)O(NlogK)输出K行,每行有一个字符串和一个整数(字符串表示)。你需要按照出现出现次数由大到小输出,若出现次数相同时字符串字典序较小的优先输出题解#include<string>#include<unordered_map>#include<queue>using namesp原创 2020-11-28 10:18:52 · 405 阅读 · 0 评论 -
NC41—找到字符串的最长无重复字符子串
题意给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)题解#include <unordered_map>class Solution {public: /** * * @param arr int整型vector the array * @return int整型 */ int maxLength(vector<int>& arr) { int len原创 2020-12-01 09:21:07 · 161 阅读 · 0 评论 -
NC127—最长公共子串
题意给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。题解思路与最长公共子序列类似,dp[i][j]表示以str1[i]和str2[j]为最后一个元素的最长公共子串的长度,只不过状态转移方程稍微变化,如果str[i] != str[j],dp[i][j] = 0class Solution {public: /** * longest common substring * @param str1 string字符串 the原创 2020-11-27 18:54:05 · 210 阅读 · 0 评论 -
NC88—寻找第K大
题意有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。题解class Finder {public: int findKth(vector<int> a, int n, int K) { return recur(a, 0, n-1, K); } int recur(vector<int>& a, int原创 2020-11-27 14:50:25 · 904 阅读 · 0 评论 -
NC105—二分查找
题意请实现有重复数字的有序数组的二分查找。输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。题解其实就是求左边界class Solution {public: /** * 二分查找 * @param n int整型 数组长度 * @param v int整型 查找值 * @param a int整型vector 有序数组 * @return int整型 */ int upper_bou原创 2020-11-26 10:21:59 · 110 阅读 · 0 评论 -
设计一个LRU缓存结构
题意题解#include <unordered_map>struct DListNode{ int key, val; DListNode* next; DListNode* pre; DListNode(int key, int value): key(key), val(val), pre(nullptr), next(nullptr){}};class DList{private: DListNode* head; DListN原创 2020-11-25 22:53:27 · 457 阅读 · 0 评论