本文最后更新于:4 个月前
基于力扣的完整算法入门笔记,发散思维,强烈建议学习!
代码随想录
从简单的数组到贪心算法等全套算法笔记,慢慢跟新。
代码随想录 (programmercarl.com)这是网站链接,配有算法原理讲解和相应力扣算法题,强烈建议学习!
数组
二分查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public int search(int[] nums, int target) { if (target < nums[0] || target > nums[nums.length - 1]) { return -1; } int left = 0, right = nums.length - 1; while (left <= right) { int mid = left + ((right - left) >> 1); if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1; else if (nums[mid] > target) right = mid - 1; } return -1; } }
|
移除元素
利用双指针,慢指针指针记录保留元素位数,快指针进行数字遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Solution { public int removeElement(int[] nums, int val) { int fastIndex = 0; int slowIndex; for (slowIndex = 0; fastIndex < nums.length; fastIndex++) { if (nums[fastIndex] != val) { nums[slowIndex] = nums[fastIndex]; slowIndex++; } } return slowIndex; } }
|
有序数组的平方
给你一个按非递减顺序
排序的整数数组nums
,返回每个数字的平方
组成的新数组,要求也按非递减顺序
排序。
利用双指针,从头和尾开始往中间合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public int[] sortedSquares(int[] nums) { int right = nums.length - 1; int left = 0; int[] result = new int[nums.length]; int index = result.length - 1; while (left <= right) { if (nums[left] * nums[left] > nums[right] * nums[right]) { result[index--] = nums[left] * nums[left]; ++left; } else { result[index--] = nums[right] * nums[right]; --right; } } return result; } }
|
长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数s
,找出该数组中满足其和 ≥ s 的长度最小的连续
子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
暴力解法
两个for循环,不断寻找符合条件的子序列
滑动窗口