- 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
第一步,找出绝对值最小的数以及位置k.
第二步,以k为中心,左右两个下标分别向数组两端移动.选出绝对值较小者,计算平方放入结果,并且移动下标.
第三步,直到左右两个下标都到达了数组两端.
时间复杂度O(n),空间复杂度O(1)
- 轮转数组
给你一个数组,将数组中的元素向右轮转 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]
暴力法
第一步,将后k个数字存入临时数组tail.
第二步,挪动1到n-k个数字到数字末尾.倒着挪,第n-k个数字挪到位置n,第n-k-1个数字挪到位置n-1.
第三步,tail数组依次填入前k个位置.
时间复杂度O(n),空间复杂度O(k)
环状替换
定义:[gcd最大公约数] [lcm最小公倍数]
第一步,k = k % n
第二步,当前cur位置的数字,挪动到next位置 = (cur+k) % n. 继续按这个方法挪动原next位置的数字到它的下一个next位置.直到next与初始的cur相等.
第三步,将第二步重复gcd(k, n)次.
证明:
第二步每完成一次,挪动的数字个数是lcm(k,n)/k, 那么,n个数字都挪动一遍,第二步的循环次数count的值:
count = n/(lcm(k,n)/k) = k*n / lcm(k,n)
k*n = lcm(k,n) * gcd(k,n)
所以,count = gcd(k,n)
每个数字只会挪动一次,因此时间复杂度O(n),空间复杂度O(1)
- 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
快慢指针法,快指针从头到尾遍历数组,慢指针从0开始.快指针当前元素不是0,则覆盖到当前慢指针位置,且慢指针++.快指针到达数组末尾时,从当前慢指针位置到末尾,都填0.
时间复杂度O(n),空间复杂度O(1)
- 两数之和 II - 输入有序数组
给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
twoSum问题,数组已排序,双指针法,一头一尾,一次遍历,时间复杂度O(n)
- 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
一头一尾指针,交换,然后移动往中间靠拢.直到两指针相遇.
- 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:“Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”
空格分割单词,找到单词的边界,然后按照上一题的方法反转单词.
- 链表的中间结点
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
快慢指针,快指针每次走两步,慢指针每次走一步.当快指针到达末尾时,慢指针就是答案.
- 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
快慢指针.快指针从头到尾遍历,每次遍历一步,第n步时慢指针开始启动,启动后,也每次遍历一步.当快指针到达末尾时,慢指针指向倒数第n个节点.
原理比较简单,细节很繁琐,注意next指针的边界…还有,开头加上dummy节点的技巧.