力扣53最大子数组的和
//此题用动态规划,我们用 f(i) 代表以第 i 个数结尾的「连续子数组的最大和」,如何求 i 个数结尾的「连续子数组的最大和可以用状态转移方程f(i)=max{f(i−1)+nums[i],nums[i]}(在每一次求子数组长度时)我们可以考虑 nums[i] 单独成为一段还是加入 f(i−1) 对应的那一段,这取决于 nums[i] 和 f(i−1)+nums[i] 的大小,我们希望获得一个比较大的值(其实这里有点类似滑动窗口如果上一个值加上本值比本值小就从本值开始算和,否则就从上一个值开始算和),再用max储存最大的子串,最后返回的结果就是具有最大和的连续子数组。
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0, maxAns = nums[0];
for (int x : nums) {
pre = Math.max(pre + x, x);
maxAns = Math.max(maxAns, pre);
}
return maxAns;
}
}
58最后一个单词的长度
//反向遍历,先求出字符串的最大下标,从最大下标开始遍历,找到单词的最后一个字母( while (s.charAt(index) == ' ')index--) ,然后从这个最后一个字母开始往前遍历,直到遇到空格,这里wordlength记录单词长度遍历每个字符,只要不是空格就加1
class Solution {
public int lengthOfLastWord(String s) {
int index=s.length()-1;
int wordlength=0;
while(s.charAt(index)==' '){
index--;
}
while(index>=0&&s.charAt(index)!=' '){
index--;
wordlength++;
}
return wordlength;
}
}
59螺旋矩阵
//定义loop控制循环次数(也就是控制圈数),start为循环开始点,count为填充的数字,whlie循环,个数为n的矩阵可以环绕n圈,里面用for循环来控制填充,首先模拟上侧从左到右,行不动,(列依次填充n-loop为边界,每循环一次边界都减一)注意的是这里不会将一行全部填充完,而是留最后一个当作下一个for循环也就是遍历列的第一个,此时第一个以此类推
class Solution {
public int[][] generateMatrix(int n) {
int loop=0;
int [][] res=new int[n][n];
int start=0;
int count=1;
int i,j;
while(loop++<n/2){
for(j=start;j<n-loop;j++){
res[start][j]=count++;
}
for(i=start;i<n-loop;i++){
res[i][j]=count++;
}
for(;j>=loop;j--){
res[i][j]=count++;
}
for (; i >= loop; i--) {
res[i][j] = count++;
}
start++;
}
if(n%2==1){
res[start][start] = count;
}
return res;
}
}