随笔分类 - 算法
重新学习算法等知识
摘要:49. 字母异位词分组 把含有相同的字母的放在一起,关键点在于如何把相同字母这个点给做成一个统一的标志,当作哈希表的key,每个元素可以当作value 排序 可以先把每个string排序,那么同一组排完序应该是同一个结果,然后做哈希,遍历一遍即可 时间复杂度:O(nklogk) 空间复杂度:O(nk
阅读全文
摘要:48. 旋转图像 使用辅助数组 行列交换,从matrix[i] [j]换到 matrix[j] [n-i-1] 时间复杂度O(n2) 空间复杂度O(n2) class Solution { public void rotate(int[][] matrix) { int n = matrix.len
阅读全文
摘要:1816. 截断句子 遍历 class Solution { public String truncateSentence(String s, int k) { String ans=""; int n = s.length(); for(int i=0;i < n;i++) { if(s.char
阅读全文
摘要:506. 相对名次 先排序,排完,按照顺序颁发名次 class Solution { public String[] findRelativeRanks(int[] score) { int n = score.length; String [] tmp = {"Gold Medal","Silve
阅读全文
摘要:1446. 连续字符 遍历一遍即可 class Solution { public int maxPower(String s) { int len = s.length(); if(len <= 0) { return 0; } int max=1,tmp=1; for(int i=1;i<len
阅读全文
摘要:剑指 Offer 57. 和为s的两个数字 前提是题目给的是升序数组 双指针 时间复杂度O(n),空间复杂度O(1) left和right指针判断当前和与目标的大小关系,大于,right左移,小于,left右移。 class Solution { public int[] twoSum(int[]
阅读全文
摘要:剑指 Offer 53 - I. 在排序数组中查找数字 I 遍历 从前到后遍历,找到一个+1 时间复杂度O(n),空间复杂度O(1) class Solution { public int search(int[] nums, int target) { if(nums.length == 0) {
阅读全文
摘要:剑指 Offer 53 - II. 0~n-1中缺失的数字 遍历 找到值不等于索引的项 时间复杂度O(n),空间复杂度O(1) class Solution { public int missingNumber(int[] nums) { int ans=0; for(ans=0;ans<nums.
阅读全文
摘要:剑指 Offer 25. 合并两个排序的链表 遍历 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode head = new ListNode(0),curr= head; while
阅读全文
摘要:剑指 Offer 24. 反转链表 迭代 把当前节点的next设置为上一个节点,需要先存下来下一个节点,并且需要有个节点保存上一个节点 时间复杂度O(n),空间复杂度O(1) class Solution { public ListNode reverseList(ListNode head) {
阅读全文
摘要:剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 暴力 扫描,遇见偶数,拿出来,把后面的数字往前移一位,刚拿出来的偶数放在最后 O(n2) 头尾指针 left遇见奇数跳过,遇见偶数停下 right遇见偶数跳过,遇见奇数停下 互相交换,继续下一次循环 class Solution { publ
阅读全文
摘要:剑指 Offer 18. 删除链表的节点 增加头节点遍历,当然这道题跟原题不太一样 class Solution { public ListNode deleteNode(ListNode head, int val) { ListNode pre = new ListNode(0); pre.ne
阅读全文
摘要:剑指 Offer 10- I. 斐波那契数列 递归 时间复杂度指数级,很多值重复计算 动态规划 每一项只计算一次,时间复杂度O(n) class Solution { public: int fib(int n) { int MOD=1000000007; if(n<2) { return n; }
阅读全文
摘要:492. 构造矩形 先开平方,然后依次判断是否可以整除即可 class Solution {public: vector<int> constructRectangle(int area) { int w = sqrt(1.0 * area); while(area%w) { --w; } retu
阅读全文
摘要:剑指 Offer 06. 从尾到头打印链表 很明显后进先出,利用栈的结构辅助。 class Solution { public: vector<int> reversePrint(ListNode* head) { stack<int> tmp; vector<int> ans; ListNode*
阅读全文
摘要:剑指 Offer 05. 替换空格 暴力 从前往后扫描,遇到一个空格就把数组后面的字符向后移动,时间复杂O(n2),代价主要在后面字符需要多次移动 从后向前遍历 先遍历一次统计空格的个数,计算出最后字符的长度,从后往前遍历,这样之后移动后面的字符,字符不会被重复移动。 class Solution
阅读全文
摘要:剑指 Offer 04. 二维数组中的查找 暴力搜索 遍历整个二维数组,时间复杂度O(mn),空间复杂度O(1) 线性查找 从右上角出发,如果右上角的数字等于target,已找到,如果大于target,向左移一列。小于target,这一行必定都小于target,向下移动一行。最多移动m列和n行。时间
阅读全文
摘要:排序 通过对数组排序,相同的数字必定相邻,扫描一下就行,但是时间复杂度为O(nlogn) class Solution {public: int findRepeatNumber(vector<int>& nums) { sort(nums.begin(),nums.end()); for(int
阅读全文
摘要:快排 分治思想 确定分界点(左边界、中间值、右边界、随机) 调整区间,分为左右两段 利用额外的a[],b[]来辅助调整(暴力做法) 双指针(优美做法) 递归处理,分别排序 以下为双指针做法的代码 void quick_sort(int q[], int l, int r) { if (l >= r)
阅读全文
摘要:题目:有n根棍子,棍子i的长度为ai。想要从中选出三根棍子组成周长尽可能长的三角形。请输出最大的周长,若无法组成三角形则输出0。 限制条件 3 ≤ n ≤ 100 1 ≤ ai ≤ 10^6输入 n = 5 a = {2,3,4,5,10} 输出 12(选择3、4、5时) 输入 n = 4 a =
阅读全文

浙公网安备 33010602011771号