努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧!
目录
1、合并两个有序的数组
题目链接:合并两个有序的数组_牛客题霸_牛客网
思路:这题可以用双指针,我直接全部存list里,然后排序,方便。
Java版:
import java.util.*;
public class Solution {
public void merge(int A[], int m, int B[], int n) {
List<Integer> list = new ArrayList<>() ;
for(int i=0; i<m; i++){
list.add(A[i]) ;
}
for(int y : B){
list.add(y) ;
}
Collections.sort(list) ;
for(int i=0; i<m+n; i++){
A[i] = list.get(i) ;
}
}
}
2、 判断是否为回文字符串
题目链接:判断是否为回文字符串_牛客题霸_牛客网
思路:定义双指针遍历比对即可。
Java版:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param str string字符串 待判断的字符串
* @return bool布尔型
*/
public boolean judge (String str) {
// write code here
int low = 0, high = str.length() - 1 ;
while(low<high){
if(str.charAt(low) != str.charAt(high)){
return false ;
}
low ++ ;
high -- ;
}
return true ;
}
}
3、反转字符串
题目链接:反转字符串_牛客题霸_牛客网
思路:一行代码调api反转即可,没必要双指针。
Java版:
import java.util.*;
public class Solution {
/**
* 反转字符串
* @param str string字符串
* @return string字符串
*/
public String solve (String str) {
// write code here
return new StringBuilder(str).reverse().toString() ;
}
}
4、最长无重复子数组
题目链接:最长无重复子数组_牛客题霸_牛客网
思路:借助队列实现,一层循环,如果不存在则入队,存在,弹出直至后不包含该元素再入队。
Java版:
import java.util.*;
public class Solution {
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
// write code here
int max = 0 ;
Queue<Integer> queue = new LinkedList<>() ;
for(int ans : arr){
if(!queue.contains(ans)){
queue.add(ans) ;
}else{
while(queue.contains(ans)){
queue.poll() ;
}
queue.add(ans) ;
}
max = max <= queue.size() ? queue.size() : max ;
}
return max ;
}
}
5、合并区间
题目链接:合并区间_牛客题霸_牛客网
思路:首先按区间进行排序,排序完成之后,在依次判断有交集的合并,无交集的直接加入集合。
Java版:
import java.util.*;
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public static ArrayList<Interval> merge(ArrayList<Interval> intervals) {
if (intervals.size() == 0) {
return new ArrayList<>() ;
}
ArrayList<Interval> list = new ArrayList<>() ;
Collections.sort(intervals, new Comparator<Interval>() {
public int compare(Interval o1, Interval o2) {
if (o1.start != o2.start)
return o1.start - o2.start;
else
return o1.end - o2.end;
}
});
list.add(intervals.get(0)) ;
for (int i = 1; i < intervals.size(); i++) {
int l1 = list.get(list.size() - 1).start ;
int r1 = list.get(list.size() - 1).end ;
int l2 = intervals.get(i).start ;
int r2 = intervals.get(i).end ;
if (l2 >= l1 && l2 <= r1) {
list.remove(list.size() - 1) ;
list.add(new Interval(l1, Math.max(r1, r2))) ;
} else if (l1 >= l2 && l1 <= r2) {
list.remove(list.size() - 1) ;
list.add(new Interval(l2, Math.max(r1, r2))) ;
} else {
list.add(intervals.get(i));
}
}
return list ;
}
}
6、盛水最多的容器
题目链接:盛水最多的容器_牛客题霸_牛客网
思路:从两边向中间遍历,枚举找出最大的容器即可,每次小的边往中间移动。
Java版:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param height int整型一维数组
* @return int整型
*/
public int maxArea (int[] height) {
// write code here
if(height.length<=1){
return 0 ;
}
int left = 0, right = height.length - 1 ;
int max = 0 ;
while(left<right){
int tmp = (right - left) * Math.min(height[left], height[right]) ;
max = Math.max(max, tmp) ;
if(height[left] >= height[right]){
right -- ;
}else{
left ++ ;
}
}
return max ;
}
}
7、接雨水问题
题目链接:接雨水问题_牛客题霸_牛客网
思路:从两边向中间依次累加,记录左右边界的最大值,每次累加水洼值即可。
Java版:
import java.util.*;
public class Solution {
/**
* max water
* @param arr int整型一维数组 the array
* @return long长整型
*/
public long maxWater (int[] arr) {
// write code here
int left = 0, right = arr.length - 1 ;
int ml = 0, mr = 0 ;
int ans = 0 ;
while(left < right){
ml = Math.max(ml, arr[left]) ;
mr = Math.max(mr, arr[right]) ;
if(ml<mr){
ans += ml - arr[left++] ;
}else{
ans += mr - arr[right--] ;
}
}
return ans ;
}
}