Runtime: 1 ms, faster than 85.87% of Java online submissions for Maximum Subarray.
O(N) 코드
classSolution{publicintmaxSubArray(int[] nums){int max = nums[0];int pre = nums[0];for(int i=1; i<nums.length; i++){if(pre >0){
pre += nums[i];
max = Math.max(pre, max);}else{
pre = nums[i];
max = Math.max(pre, max);}}return max;}}
Divide and Conquer
2ms
ide 사용하고 debugging하는데 시간이 오래 걸림
2개또는 1개로 자른다.
데이터를 머지할때 3가지 데이터를 구한다
leftMost = 왼쪽 0번째 인덱스 부터 시작해서 가장 큰 sum을 구한다.
rightMost = 오른쪽 0번째 인덱스부터 왼쪽으로 가장 큰 sum을 구한다.
full 은 머지한전체 sum, leftMost와 rightMost를 구하기 위해서 필요함.
publicclassSolution{int max =0;int[] nums ;publicintmaxSubArray(int[] nums){
max = nums[0];this.nums = nums;divideAndConquer(0, nums.length-1);return max;}public Data divideAndConquer(int start,int end){
Data data =newData();if(start == end){
data.full = nums[start];
data.leftMost = nums[start];
data.rightMost = nums[start];
max = Math.max(max ,data.full);return data;}elseif(start == end-1){
data.full = nums[start]+ nums[end];
data.leftMost = Math.max(nums[start], nums[start]+ nums[end]);
data.rightMost = Math.max(nums[end], nums[start]+ nums[end]);
max = Math.max(max ,data.leftMost);
max = Math.max(max ,data.rightMost);return data;}int mid =(end-start)/2+ start;// left
Data left =divideAndConquer(start, mid);// right
Data right =divideAndConquer(mid+1,end);if(left.rightMost >0|| right.leftMost >0){
max = Math.max((Math.max(left.rightMost,0)+ Math.max(right.leftMost,0)), max);}
data.leftMost = Math.max(left.leftMost, left.full + right.leftMost);
data.rightMost = Math.max(right.rightMost, right.full + left.rightMost);
data.full = right.full + left.full;
max = Math.max(max, data.leftMost);
max = Math.max(max, data.rightMost);
max = Math.max(max, data.full);return data;}}classData{int leftMost;int full;int rightMost;}
2 로 나누기 비트연산하면서 0 to 1 , 1 to 0으로 변경한 비트 값을 더해줌
2번째 방법
digit을 구한후 해당 xor 연산으로 한번에 풀었음
Runtime: 0 ms, faster than 100.00% of Java online submissions for Complement of Base 10 Integer.
classSolution{publicintbitwiseComplement(int N){if(N==0){return1;}int digit =0;int sum =0;while(N>0){int remainder = N %2;
N = N>>1;if(remainder ==0){
sum +=1<< digit;}
digit++;}return sum;}}
두번째 코드
classSolution{publicintbitwiseComplement(int N){int digit =1;int n = N;while((n= n >>1)>0){
digit++;}int compare =(2<< digit-1)-1;return N^compare;}}
int a =0x010;
System.out.println(a);
a =0x0010;
System.out.println(a);
a =0x0000010;
System.out.println(a);
a =0x000000000000000000000000000000000000000010;
System.out.println(a);
16진수를 표현하는 방법?
0x에 0 to f 까지 표현할수 있다. (0 -15)
<< number , >> number 연산자
비트값을 왼쪽으로 number만큼 움직여준다.
int a =8;
System.out.println(Integer.toBinaryString(a));// 001000
a = a <<2;
System.out.println(Integer.toBinaryString(a));// 100000
a = a >>2;
System.out.println(Integer.toBinaryString(a));// 001000
1을 오른쪽으로 비트 연산하게 되는경우 어떻게 나올까??
int a =1;
System.out.println(Integer.toBinaryString(a));// 00001
a = a >>5;
System.out.println(Integer.toBinaryString(a));// 0
Runtime: 15 ms, faster than 71.70% of Java online submissions for Repeated Substring Pattern.
Memory Usage: 36.5 MB, less than 100.00% of Java online submissions for Repeated Substring Pattern.
classSolution{publicbooleanrepeatedSubstringPattern(String s){//abcabcabcabcchar[] arr = s.toCharArray();// distancefor(int i=1; i<=arr.length/2; i++){if(arr.length % i !=0){continue;}boolean allSame =true;// 각 파티션
second :for(int j=i; j<arr.length; j+=i){// 파티션의 distacne 까지 비교for(int k=0; k<i; k++){if(arr[k]!= arr[j+k]){
allSame =false;break second;}}}if(allSame){returntrue;}}returnfalse;}}
head.val 과 head.next.val 을 비교해서 같으면 head.next.next를 head.next에 연결해준다.
Runtime: 0 ms, faster than 100.00% of Java online submissions for Remove Duplicates from Sorted List.
Memory Usage: 36.2 MB, less than 100.00% of Java online submissions for Remove Duplicates from Sorted List.