1.找出数组最小的k个数
class Solution {
public int[] smallestK(int[] arr, int k) {
int[] vec = new int[k];
Arrays.sort(arr);
for (int i = 0; i < k; ++i) {
vec[i] = arr[i];
}
return vec;
}
}
这里可以用Arrays.sort()对数组进行排序
2.两数之和(有视频讲解)
暴力
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
return new int[0];
}
}
之前6个月做过 ,现在过来还是要对着答案,没办法自己撸出来,对于for循环内部的变量要声明类型int
查找表(省略,后面有时间再回来看, 复习)
3.爬楼梯(简单)为什么写编程题都没有思路的?动态规划
class Solution {
public int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
}
为什么这里的代码这么简单我却看不懂什么意思?难道是我的基础出了问题?
第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法
下面的方法解释的很透彻
第二种思路
标签:动态规划
本问题其实常规解法可以分成多个子问题,爬第n阶楼梯的方法数量,等于 2 部分之和
爬上 n−1n-1n−1 阶楼梯的方法数量。因为再爬1阶就能到第n阶
爬上 n−2n-2n−2 阶楼梯的方法数量,因为再爬2阶就能到第n阶
所以我们得到公式 dp[n]=dp[n−1]+dp[n−2]dp[n] = dp[n-1] + dp[n-2]dp[n]=dp[n−1]+dp[n−2]
同时需要初始化 dp[0]=1dp[0]=1dp[0]=1 和 dp[1]=1dp[1]=1dp[1]=1
时间复杂度:O(n)O(n)O(n)
第二种思路代码
class Solution {
public int climbStairs(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
4.翻转二叉树
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}
}
一个早上从9点多写到12点才写了4道…漫长