package MarchDay;
/**
* @author lzm
* @create 2020- 03- 11- 10:41
*
* 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false。
* 形式上,如果可以找出索引 i+1 < j 且满足
* (A[0] + A[1] + ... + A[i] == A[i+1] + A[i+2] + ... + A[j-1] == A[j] + A[j-1] + ... + A[A.length - 1])
* 就可以将数组三等分。
*
*/
public class Equal {
public static void main(String[] args) {
int [] A=new int[]{0,2,1,-6,6,-7,9,1,2,0,1};
boolean b = canThreePartsEqualSum(A);
System.out.println(b);
}
public static boolean canThreePartsEqualSum(int[] A) {
if (A==null ||A.length<3) return false;
int sum=0;
for (int i = 0; i <A.length ; i++) {
sum=sum+A[i];
}
if (sum%3!=0) return false;
int single=sum/3;
int partSum = 0; // 当前部分的和
int parts = 0; // 当前已有几部分满足
for (int i = 0; i < A.length; i++) {
partSum += A[i];
if (partSum == single) {
parts++;
partSum = 0;
}
}
// 分析:flag >= 3的意思是,如果超过3个,而每部分的和还一样,证明有N个部分的和是0,可以归到任何一个部分中,最终结果可看做3个
// 例如[1,-1,1,-1,1,-1,1,-1],这里的flag = 4,但是可以把最后一个1,-1归到第三部分中,也就是[1,-1][1,-1][1,-1,1,-1]
// 所以判断是成立的
return parts >= 3;
}
}
package MarchDay;
/**
* @author lzm
* @create 2020- 03- 12- 10:33
*
* 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,
* 我们才认定 “T 能除尽 S”。
* 返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
*
*
* 最大公约数(Greatest Common Divisor)缩写为GCD
* gcd定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数
* gcd算法:gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)
*/
public class Divisor {
public static void main(String[] args) {
String str1 = "ABC", str2 = "ABCABC";
String s = gcdOfStrings(str1, str2);
System.out.println(s);
}
public static String gcdOfStrings(String str1, String str2) {
// 假设str1是N个x,str2是M个x,那么str1+str2肯定是等于str2+str1的。
if (!(str1 + str2).equals(str2 + str1)) {
return "";
}
// 辗转相除法求gcd。
return str1.substring(0, gcd(str1.length(), str2.length()));
}
private static int gcd(int a, int b) {
return b == 0? a: gcd(b, a % b);
}
}
13.169. 多数元素
package MarchDay;
import java.util.HashMap;
import java.util.Map;
/**
* @author lzm
* @create 2020- 03- 13- 9:42
*
* 给定一个大小为 n 的数组,找到其中的多数元素。
* 多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
* 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
*/
public class majority {
public static void main(String[] args) {
int nums[]={2,2,1,1,1,2,2};
majority majority=new majority();
int i = majority.majorityElement(nums);
System.out.println(i);
}
public int majorityElement(int[] nums) {
int majority = nums.length/2;
Map<Integer,Integer> res=new HashMap<>();
for (int i = 0; i < nums.length; i++) {
res.put(nums[i],res.getOrDefault(nums[i],0)+1);
}
//遍历map集合
for(Map.Entry<Integer, Integer> a:res.entrySet()){
if (a.getValue()>majority) return a.getKey();
}
return -1;
}
}
14.300. 最长上升子序列
package MarchDay;
import java.util.Arrays;
/**
* @author lzm
* @create 2020- 03- 14- 9:03
*
* 300. 最长上升子序列
*/
public class Subsequence {
public static void main(String[] args) {
int[] nums={10,9,2,5,3,7,101,18};
Subsequence subsequence=new Subsequence();
int i = subsequence.lengthOfLIS(nums);
System.out.println(i);
}
public int lengthOfLIS(int[] nums) {
int len=nums.length;
if (len<2)
{
return len;
}
int[] dp=new int[len];
Arrays.fill(dp,1);
for (int i = 0; i < len; i++) {
for (int j = 0; j < i; j++) {
if (nums[j]<nums[i])
{
dp[i]=Math.max(dp[i],dp[j]+1);
}
}
}
int res=0;
for (int i = 0; i < len; i++) {
res=Math.max(res,dp[i]);
}
return res;
}
}
15.695. 岛屿的最大面积
package MarchDay;
/**
* @author lzm
* @create 2020- 03- 15- 9:07
* 岛屿的最大面积
*/
public class IsLand {
public static void main(String[] args) {
int[][] grid={{1,1,0,0,0},
{1,1,0,0,0},
{0,0,0,1,1},
{0,0,0,1,1}};
IsLand isLand=new IsLand();
int i = isLand.maxAreaOfIsland(grid);
System.out.println(i);
}
public int maxAreaOfIsland(int[][] grid) {
int MaxArea=0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j]==1){
MaxArea=Math.max(MaxArea,ExpandArea(grid,i,j));
}
}
}
return MaxArea;
}
private int ExpandArea(int[][] grid, int i, int j) {
if (i>=grid.length||i<0) return 0;
if (j>=grid[0].length||j<0) return 0;
if (grid[i][j]==1)
{
grid[i][j]=0;
return 1+ExpandArea(grid,i+1,j)+ExpandArea(grid,i-1,j)+ExpandArea(grid,i,j-1)+ExpandArea(grid,i,j+1);
}
return 0;
}
}
package MarchDay;
/**
* @author lzm
* @create 2020- 03- 16- 18:32
*/
public class StringCompress {
public static void main(String[] args) {
String s="abbccd";
StringCompress stringCompress=new StringCompress();
String s1 = stringCompress.compressString(s);
System.out.println(s1);
}
public String compressString(String S) {
int length = S.length();
if (S==null || length==0) return S;
int i=0,j=0;
int sum=0;
StringBuilder NewString=new StringBuilder();
while (j<length)
{
if (S.charAt(i)==S.charAt(j))
{
j++;
}else {
NewString.append(S.charAt(i)).append(j-i);
i=j;
}
}
NewString.append(S.charAt(i)).append(j-i);
if (NewString.length()>=length) return S;
return String.valueOf(NewString);
}
}
17.1160. 拼写单词
package MarchDay;
import java.util.HashMap;
import java.util.Map;
/**
* @author lzm
* @create 2020- 03- 17- 9:09
*/
public class Words {
public static void main(String[] args) {
String[] words={"dyiclysmffuhibgfvapygkorkqllqlvokosagyelotobicwcmebnpznjbirzrzsrtzjxhsfpiwyfhzyonmuabtlwin","ndqeyhhcquplmznwslewjzuyfgklssvkqxmqjpwhrshycmvrb","ulrrbpspyudncdlbkxkrqpivfftrggemkpyjl","boygirdlggnh","xmqohbyqwagkjzpyawsydmdaattthmuvjbzwpyopyafphx","nulvimegcsiwvhwuiyednoxpugfeimnnyeoczuzxgxbqjvegcxeqnjbwnbvowastqhojepisusvsidhqmszbrnynkyop","hiefuovybkpgzygprmndrkyspoiyapdwkxebgsmodhzpx","juldqdzeskpffaoqcyyxiqqowsalqumddcufhouhrskozhlmobiwzxnhdkidr","lnnvsdcrvzfmrvurucrzlfyigcycffpiuoo","oxgaskztzroxuntiwlfyufddl","tfspedteabxatkaypitjfkhkkigdwdkctqbczcugripkgcyfezpuklfqfcsccboarbfbjfrkxp","qnagrpfzlyrouolqquytwnwnsqnmuzphne","eeilfdaookieawrrbvtnqfzcricvhpiv","sisvsjzyrbdsjcwwygdnxcjhzhsxhpceqz","yhouqhjevqxtecomahbwoptzlkyvjexhzcbccusbjjdgcfzlkoqwiwue","hwxxighzvceaplsycajkhynkhzkwkouszwaiuzqcleyflqrxgjsvlegvupzqijbornbfwpefhxekgpuvgiyeudhncv","cpwcjwgbcquirnsazumgjjcltitmeyfaudbnbqhflvecjsupjmgwfbjo","teyygdmmyadppuopvqdodaczob","qaeowuwqsqffvibrtxnjnzvzuuonrkwpysyxvkijemmpdmtnqxwekbpfzs","qqxpxpmemkldghbmbyxpkwgkaykaerhmwwjonrhcsubchs"};
String chars= "usdruypficfbpfbivlrhutcgvyjenlxzeovdyjtgvvfdjzcmikjraspdfp";
Words words1=new Words();
int i = words1.countCharacters(words, chars);
System.out.println(i);
}
public int countCharacters(String[] words, String chars) {
int num=0;
Map<Character,Integer> map=new HashMap<>();
for (int i = 0; i < chars.length(); i++) {
char c = chars.charAt(i);
map.put(c,map.getOrDefault(c,0)+1);
}
//遍历整个words数组
for (String s:words) {
boolean flag = true;
Map<Character,Integer> map1=new HashMap<>();
map1.putAll(map);
// 遍历words下的每个单词
for (int j = 0; j <s.length() ; j++) {
char c = s.charAt(j);
// 判断map中没有该单词的字母
if (map1.get(c)==null){
flag = false;
break;
}
if (map1.get(c)==0){
flag = false;
break;
}else {
map1.put(c,map.get(c)-1);
}
}
if (flag) num=num+s.length();
}
return num;
}
}
18.836. 矩形重叠
package MarchDay;
/**
* @author lzm
* @create 2020- 03- 18- 9:01
* [0,0,1,1]
* [1,0,2,1]
*/
public class Rectangle {
public static void main(String[] args) {
int[] rec1 = {0,0,2,2}, rec2 = {1,1,3,3};
Rectangle rectangle=new Rectangle();
boolean rectangleOverlap = rectangle.isRectangleOverlap(rec1, rec2);
System.out.println(rectangleOverlap);
}
public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
if(rec2[1] >= rec1[3] || rec1[1] >= rec2[3]){
return false;
}
if(rec1[0] >= rec2[2] || rec1[2] <= rec2[0]){
return false;
}
return true;
}
}
19.409. 最长回文串
package MarchDay;
/**
* @author lzm
* @create 2020- 03- 19- 9:09
* 最长回文串
*/
public class Palindrome {
public static void main(String[] args) {
String s="abccccdd";
Palindrome palindrome=new Palindrome();
int i = palindrome.longestPalindrome(s);
System.out.println(i);
}
public int longestPalindrome(String s) {
int[] res=new int[52];
for (char c:s.toCharArray())
{
if (c>='a' && c<='z')
{
res[c-'a']++;
}else {
res[c-'A'+26]++;
}
}
int count=0;
for (int i:res) {
if (i%2==0) count=count+i;
else count=count+i-1;
}
return count<s.length()?count+1:count;
}
}
package MarchDay;
import java.util.Arrays;
/**
* @author lzm
* @create 2020- 03- 20- 10:23
* 面试题40. 最小的k个数
* https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/tu-jie-top-k-wen-ti-de-liang-chong-jie-fa-you-lie-/
*/
public class MInK {
public static void main(String[] args) {
int[] arr={3,2,1};
int k = 2;
MInK m=new MInK();
int[] leastNumbers = m.getLeastNumbers(arr, k);
System.out.println(Arrays.toString(leastNumbers));
}
public int[] getLeastNumbers(int[] arr, int k) {
if (k == 0) {
return new int[0];
} else if (arr.length <= k) {
return arr;
}
// 原地不断划分数组
partitionArray(arr, 0, arr.length - 1, k);
// 数组的前 k 个数此时就是最小的 k 个数,将其存入结果
int[] res = new int[k];
for (int i = 0; i < k; i++) {
res[i] = arr[i];
}
return res;
}
void partitionArray(int[] arr, int lo, int hi, int k) {
// 做一次 partition 操作
int m = partition(arr, lo, hi);
// 此时数组前 m 个数,就是最小的 m 个数
if (k == m) {
// 正好找到最小的 k(m) 个数
return;
} else if (k < m) {
// 最小的 k 个数一定在前 m 个数中,递归划分
partitionArray(arr, lo, m-1, k);
} else {
// 在右侧数组中寻找最小的 k-m 个数
partitionArray(arr, m+1, hi, k);
}
}
// partition 函数和快速排序中相同,具体可参考快速排序相关的资料
// 代码参考 Sedgewick 的《算法4》
int partition(int[] a, int lo, int hi) {
int i = lo;
int j = hi + 1;
int v = a[lo];
while (true) {
while (a[++i] < v) {
if (i == hi) {
break;
}
}
while (a[--j] > v) {
if (j == lo) {
break;
}
}
if (i >= j) {
break;
}
swap(a, i, j);
}
swap(a, lo, j);
// a[lo .. j-1] <= a[j] <= a[j+1 .. hi]
return j;
}
void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
//大根堆
// if (k == 0) {
// return new int[0];
// }
// // 使用一个最大堆(大顶堆)
// // Java 的 PriorityQueue 默认是小顶堆,添加 comparator 参数使其变成最大堆
// Queue<Integer> heap = new PriorityQueue<>(k, (i1, i2) -> Integer.compare(i2, i1));
//
// for (int e : arr) {
// // 当前数字小于堆顶元素才会入堆
// if (heap.isEmpty() || heap.size() < k || e < heap.peek()) {
// heap.offer(e);
// }
// if (heap.size() > k) {
// heap.poll(); // 删除堆顶最大元素
// }
// }
//
// // 将堆中的元素存入数组
// int[] res = new int[heap.size()];
// int j = 0;
// for (int e : heap) {
// res[j++] = e;
// }
// return res;
}