
基础算法
主要为常见的笔试算法题和数据结构知识
jc_hook
集中一点,登峰造极
展开
-
SubarraySum(子数组总和)
给定一个整数数组,求该数组所有子数组中所有元素的和。例如,一个包含三个元素的数组[4,5,6]可以分成以下子数组:1个元素数组:[4],[5],[6]2个元素数组:[4,5],[5,6],[4,6]3个元素数组:[4,5,6]所有子数组中所有元素的和为:4 + 5 + 6 +(4+5)+(5+6)+(4+5+6)=50。原创 2023-04-19 22:02:34 · 437 阅读 · 0 评论 -
leetCode-三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 :输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]目录逻辑源码逻辑对数组进行排序-4-1-1012每次遍历,从当前下标后的元素从两端慢慢匹配(left=i+1,right=nums.length()-原创 2022-03-18 13:57:50 · 406 阅读 · 0 评论 -
leetCode-删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]这个算法可以通过直接遍历出链表的长度,再根据长度再次遍历删除第N个结点。我这里主要用的是双指针算法,通过两个快慢节点遍历链表,这个算法好处就是只遍历一次。先让fast节点前进N个节点slow每次都是在待删除的前一个节点, 所以要先让fast先走一步让slow结点和fast节点同时走,每次走一步当fast点走完时slo原创 2022-02-22 14:01:23 · 481 阅读 · 0 评论 -
leetCode-转轮数组
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。示例 :输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]这个,我是通过反转数组来实现的。以示例来比喻,对长度为n(7)右转k(3)个位置1234567分位三步,第一步将0位,到原创 2022-02-19 11:11:16 · 292 阅读 · 0 评论 -
leetCode-杨辉三角
题目:给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例 1:输入: numRows = 5输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:输入: numRows = 1输出: [[1]]我都快忘了,杨辉三角是什么知道的。今天看了看,这个题其实还是容易理解的第n行有第n列当为第一列或者n列,存放1。其他列:等于上一行的前一列的元素与上一原创 2021-08-20 15:53:48 · 147 阅读 · 0 评论 -
合并两个有序数组
问题:给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。题目来自leetCode88.合并两个有序数组示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5原创 2021-08-12 15:08:17 · 480 阅读 · 0 评论 -
生成螺旋矩阵
在leetCode和牛客上都看到这样一道算法:描述:给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。示例1输入:[[1,2,3],[4,5,6],[7,8,9]]复制返回值:[1,2,3,6,9,8,7,4,5]算是比较基础的算法,但是一开始做的时候,我脑子出现了卡壳,所以还是记录一下吧。如下表,这个二维数组,形成了一个3×3的矩阵123456789按照瞬时针的方向,也就是:右→下→左→上的顺序循环,达到边界原创 2021-07-24 16:44:28 · 202 阅读 · 0 评论 -
跳台阶
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。这个其实比较简单的算法,只需要每次使用跳二阶,跳一阶为参数递归,当最后剩余的阶数为0,说明是正确的跳法,跳法数+1;源码/** * 跳台阶 * 每次跳1或2阶,求所有跳法 * @param target 台阶数 */ public int JumpFloor(int target){ //当为0时,说明已经跳完原创 2021-02-13 15:18:05 · 83 阅读 · 0 评论 -
使用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。栈的特点是什么?队列的特点是什么?存放数据:用其中的栈stack1去存放数据,这样就变成先进的数据在栈底的顺序存放在stack1中;取数据:从stack1栈顶取数据存放到另一个栈stack2中,这样数据由正→反→正,再次变为先进的数据在栈顶的顺序,这时在使用stack2的pop()方法,取栈顶数据,就实现了先进先出的特点;这种能实现的前提是,每次都是所有数据出栈完,再存放数据;如果出现出栈一原创 2021-02-02 22:55:39 · 442 阅读 · 0 评论 -
两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。首先,我们要考虑几种情况:两个链表中存在空链表当两个链表中,存在空链表时,说明不存在非空公共节点,直接返回null;两个链表为包含关系只需要判定两个链表的长度,获取较短链表的起始节点即使两个链表的第一个公共节点;两个链表相交需要求出两个链表长度,遍历至相同长度的链表起始点,然后逐节点遍历,逐节点比较,相等时返回当前节点;从上面的分析,我们其实可以提取共同点,保留不同点,得到实现逻辑:判断是否存在空链表,是则返原创 2021-02-02 22:07:13 · 160 阅读 · 0 评论 -
二叉树中是否存在节点和为指定值的路径
题目:给定一个二叉树和一个值 sum,判断是否有从根节点到叶子节点的节点值之和等于sum 的路径实现逻辑:其实就是对二叉树进行遍历,每次遍历时,指定值sum减去当前节点的值,如果此刻sum为0,且无左右子树,则说明该二叉树存在节点和为指定值的路径;示例:步骤操作是否叶子节点路径减去当前节点后的sum值1访问节点3否372访问节点2否3→253访问节点1是3→2→144访问节点5是3→2→505访问节点8否原创 2021-02-02 14:56:12 · 262 阅读 · 0 评论 -
括号序列
题目:给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。实现逻辑将字符串转换为字符数组;遍历字符数组;每次遍历时,当前字符为左括号,例如:(,[,{;则向栈存放对应的右括号(如),},]);如果不为左括号,则判断当前栈是否空(以为出现右括号在前的不合法括号)或者当前字符不为栈顶元素(出现不合法的右括号匹配左括号,如:"(]")原创 2021-01-29 13:40:03 · 968 阅读 · 0 评论 -
判断单链表是否有环
题目:给定一个单链表是否有环?这是一个比较常见且经典的算法题目。在思考怎么实现前,我们要先思考一下怎么样的单链表才算有环?例如:但是,不止这种以下的几种单链表都是有环环形链表:尾部有环:实现逻辑:判断该单链表是否有环,其实就是链表无终点的现象,但是我们无法单纯地通关无重点来返回判断结果。所以我们需要中这个循环的过程,使用快、慢两个指针在循环中追逐,直到相遇,此时就可以判定该单链表有环。指针fast、slow都起始于同一位置每次slow移动一个节点,fast移动两个原创 2021-01-29 13:18:34 · 1051 阅读 · 0 评论 -
求子集(递归解法)
题目:给定集合,求该集合的子集,如集合{1,2,3}的子集为:空集、{1}、{2}、{3}、{1,2}、{1,3}、{2,3}、{1,2,3},共2^3(即8)个子集。以下使用递归解法求子集:目录源码实现逻辑源码public ArrayList<ArrayList<Integer>> subSet(int[] arr){ ArrayList<ArrayList<Integer>> result = new ArrayList<>(原创 2021-01-27 22:51:56 · 3009 阅读 · 0 评论 -
取出list集合的相同元素和不同元素
比较两个list,分别找出相同元素和不同元素。示例如下:List<String> list1 = new ArrayList<String>();list1.add("苹果手机");list1.add("电脑");list1.add("苹果");list1.add("苹果");List<String> list2 = new ArrayList<String>();list2.add("华为手机");list2.add("电脑");lis原创 2021-01-05 15:29:47 · 2829 阅读 · 0 评论 -
实现反转链表
在一些笔试中看到了这个题目,所有记录一下相关的实现逻辑。实现反转链表目前个人想到的是两个办法:遍历(简单粗暴)递归目录一 遍历1.1 源码1.2 实现逻辑二 递归2.1 源码2.2 实现逻辑一 遍历1.1 源码public ListNode reverseList(ListNode node){ ListNode head = null; ListNode next = null; while(node!=null){ next = node.next; node.next原创 2021-01-25 20:08:31 · 112 阅读 · 0 评论 -
定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k
目录实现逻辑双层遍历解法ArrayList解法源码双层遍历解法ArrayList解法实现逻辑如下图;只要找到当前位置后的k个元素中有元素等于当前元素即可。双层遍历解法双层遍历,每次遍历都将当前位置i的元素,于(i+1)到(i+k)元素进行比较如果相等,则返回true;注意:i后元素遍历时,要保证不越界;ArrayList解法只进行一层遍历,利用ArrayList存储元素,每次只存储K个元素,使用contains()方法校验在ArrayList是否有这个元素,有则返回true;当元素数量超原创 2021-01-12 20:47:48 · 2416 阅读 · 0 评论 -
给定数组A,相邻元素差的绝对值都是1,现在给定一个目标整数t,请找到t在A中的位置
给定数组A,相邻元素差的绝对值都是1,现在给定一个目标整数t,请找到t在A中的位置:处理逻辑判断该数组是否为空,是则返回-1,否则进行下面的步骤;判读数组长度是否为0,是则返回-1,否则进行下面的步骤;使用StrictMath的abs()计算目标整数与数组首位的绝对值;取绝对值判断该绝对值位置的值,判断是否等于目标t,是则返回当前位置,否则进入下一步骤;计算当前位置与目标值之差的绝对值,取当前位置+绝对值,重复第4步,直到找到位置,或超过数组的长度;为什么要使用绝对值叠加?因为数组中相原创 2021-01-12 17:24:58 · 459 阅读 · 0 评论