努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧!
目录
1、分糖果问题
题目链接:分糖果问题_牛客题霸_牛客网
思路:主要就是满足两个条件,初始化数组元素为1,满足第一个,对于第二个条件,则从作到右和从右到左两轮循环,保证相邻大的分的糖果多,即比左右两个分的都多。
Java版:
import java.util.*;
public class Solution {
/**
* pick candy
* @param arr int整型一维数组 the array
* @return int整型
*/
public int candy (int[] arr) {
// write code here
if(arr.length == 1){
return 1 ;
}
int [] candy = new int [arr.length] ;
Arrays.fill(candy, 1) ;
for(int i=1; i<arr.length; i++){
if(arr[i-1] < arr[i]){
candy[i] = candy[i-1] + 1 ;
}
}
for(int i=arr.length-1; i>0; i--){
if(arr[i-1] > arr[i]){
candy[i-1] = Math.max(candy[i-1],candy[i] + 1) ;
}
}
int ans = 0 ;
for(int s : candy){
ans += s ;
}
return ans ;
}
}
2、主持人调度(二)
题目链接:主持人调度(二)_牛客题霸_牛客网
思路:定义两个数组,记录开始时间和结束时间,先排序,然后排序,若下一次开始时间大于当前结束时间则不需要增加主持人,否则需要增加一个主持人。
Java版:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算成功举办活动需要多少名主持人
* @param n int整型 有n个活动
* @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
* @return int整型
*/
public int minmumNumberOfHost (int n, int[][] startEnd) {
// write code here
int [] s = new int [n] ;
int [] e = new int [n] ;
for(int i=0; i<n; i++){
s[i] = startEnd[i][0] ;
e[i] = startEnd[i][1] ;
}
Arrays.sort(s) ;
Arrays.sort(e) ;
int ans = 0 ;
int j = 0 ;
for(int i=0; i<n; i++){
if(s[i] >= e[j]){
j ++ ;
}else{
ans ++ ;
}
}
return ans ;
}
}
3、旋转数组
题目链接:旋转数组_牛客题霸_牛客网
思路:三次翻转可以模拟数组的旋转,注意m可能比n大,所以要取余。
Java版:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 旋转数组
* @param n int整型 数组长度
* @param m int整型 右移距离
* @param a int整型一维数组 给定数组
* @return int整型一维数组
*/
public int[] solve (int n, int m, int[] a) {
// write code here
m = m % n ;
reverse(a,0,n-1) ;
reverse(a,0,m-1) ;
reverse(a,m,n-1) ;
return a ;
}
public void reverse(int [] a, int left, int right){
while(left<right){
int tmp = a[left] ;
a[left] = a[right] ;
a[right] = tmp ;
left ++ ;
right -- ;
}
}
}
4、螺旋矩阵
题目链接:螺旋矩阵_牛客题霸_牛客网
思路:定义上下左右四个角,然后然后模拟走四个边,依次存入集合即可。
Java版:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix int整型二维数组
* @return int整型ArrayList
*/
public ArrayList<Integer> spiralOrder (int[][] matrix) {
// write code here
ArrayList<Integer> list = new ArrayList<>() ;
if(matrix.length == 0){
return list ;
}
int top = 0 ;
int bottom = matrix.length - 1;
int left = 0 ;
int right = matrix[0].length - 1;
while(true){
for(int i=left; i<=right; i++){
list.add(matrix[top][i]) ;
}
top ++ ;
if(top>bottom){
break ;
}
for(int i=top; i<=bottom; i++){
list.add(matrix[i][right]) ;
}
right -- ;
if(right < left){
break ;
}
for(int i=right; i>=left; i--){
list.add(matrix[bottom][i]) ;
}
bottom -- ;
if(bottom < top){
break ;
}
for(int i=bottom; i>=top; i--){
list.add(matrix[i][left]) ;
}
left ++ ;
if(left > right){
break ;
}
}
return list ;
}
}
5、顺时针矩阵旋转
题目链接:顺时针旋转矩阵_牛客题霸_牛客网
思路:可以开辟一个新数组,找到旋转前后的下标映射关系。也可以直接在原数组上对角线元素交换,再上下或者左右元素交换模拟翻转。
Java版:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param mat int整型二维数组
* @param n int整型
* @return int整型二维数组
*/
public int[][] rotateMatrix (int[][] mat, int n) {
// write code here
int [][] ans = new int [n][n] ;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
ans[j][n-i-1] = mat[i][j] ;
}
}
return ans ;
}
}