public int[] twoSum(int[] nums, int target) {
int length=nums.length;
int[] ans = new int[2];
for (int i = 0; i <length-1 ; i++) {
for (int j = i+1; j < length; j++) {
if(nums[i]+nums[j]==target){
ans[0]=i;
ans[1]=j;
}
}
}
return ans;
}
字母异位词分组
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<String, List<String>> map = new HashMap<>();
List<List<String>> res = new ArrayList<>();
for (String str : strs) {
char[] chars = str.toCharArray();//把字符串转为数组
Arrays.sort(chars);//排序
String sortedStr = new String(chars);//把数组转为字符串
List<String> tempList = map.getOrDefault(sortedStr, new ArrayList<>());//有就加入,没有就创建新的列表
tempList.add(str);
map.put(sortedStr,tempList);
}
res.addAll(map.values());
return res;
}
最长连续序列
public int longestConsecutive(int[] nums) {
if(nums.length==0){
return 0;
}
Set<Integer> set = new HashSet<>();//去重
List<Integer> list = new ArrayList<>();
for (int i : nums) {
set.add(i);
}
list.addAll(set);
Collections.sort(list);
int cnt=0;
int max=0;
for (int i = 1; i < list.size(); i++) {
if(list.get(i)-1==list.get(i-1)){
cnt++;
}else {
cnt=0;
}
max=Math.max(cnt,max);
}
return max+1;
}
双指针
移动零
public void moveZeroes(int[] nums) {
int temp=0;
for (int i = 0; i < nums.length; i++) {
if(nums[i]!=0){//用一个临时值,把所有非0的元素全都移动到前面
nums[temp]=nums[i];
temp++;
}
}
while (temp<nums.length){//后面的补上0
nums[temp]=0;
temp++;
}
}
盛最多水的容器
//左右两个指针
//每次移动最短的 因为移动最短的面积有可能增大 移动长的面积一定变小
public int maxArea(int[] height) {
int i=0;
int j=height.length-1;
int res=0;
while (i<j){
int value=Math.min(height[i],height[j])*(j-i);
if(height[i]<height[j]){
res=Math.max(res,value);
i++;
}else {
res=Math.max(res,value);
j--;
}
}
return res;
}
三数之和
//三重for循环超时
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
HashSet<List<Integer>> set = new HashSet<>();//去重
for (int i = 0; i < nums.length-2; i++) {
for (int j = i+1; j < nums.length-1; j++) {
for (int k = j+1; k < nums.length; k++) {
if(nums[i]+nums[j]+nums[k]==0){
List<Integer> list= new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
Collections.sort(list);
set.add(list);
}
}
}
}
res.addAll(set);
return res;
}
接雨水
//按列来看 装的水的高度为左右两边的最低高度减去自身的高度
public int trap(int[] height) {
int sum=0;
for (int i = 0; i < height.length; i++) {
if(i==0||i==height.length-1){
continue;
}
int left=height[i];
int right=height[i];
for (int j = i-1; j >=0 ; j--) {//记录左边最高高度
if(height[j]>left){
left=height[j];
}
}
for (int j = i+1; j <=height.length-1 ; j++) {//记录右边最高高度
if(height[j]>right){
right=height[j];
}
}
sum+=Math.min(left,right)-height[i];
}
return sum;
}
题目:
https://www.luogu.com.cn/problem/B3626
题目描述
地上有一排格子,共 n 个位置。机器猫站在第一个格子上,需要取第 n 个格子里的东西。
机器猫当然不愿意自己跑过去,所以机器猫从口袋里掏出了一个机器人!这…