从现在开始每天至少刷一道题。
题库:lintcode
有些题目链接打不开,需要权限,那大家就去九章算法参考答案里找找。
382. Triangle Count
题目链接
难度:medium
算法:双指针
时间复杂度:O(n^2)
空间复杂度:O(1)
解题思路
根据两边之和大于第三边,先找最大边,然后根据2sum的方法找到和大于最大边的两个数。
解法
public class Solution {
/**
* @param S: A list of integers
* @return: An integer
*/
public int triangleCount(int[] S) {
// write your code here
Arrays.sort(S);
int ans = 0;
for(int i=0;i<S.length; i++){
int left = 0;
int right = i - 1;
while(left < right){
if(S[left] + S[right] > S[i] ){
ans = ans + right - left;
right--;
}else{
left++;
}
}
}
return ans;
}
}
144. Interleaving Positive and Negative Numbers
题目链接
难度:medium
算法:双指针
时间复杂度:O(n)
空间复杂度:O(1)
解题思路
先分别统计正数和负数的个数。然后把个数多的那一类放在左边,个数少的放在右边。当正数在一边,负数在一边后,再进行正负替换。
解法
public class Solution {
/*
* @param A: An integer array.
* @return: nothing
*/
public void rerange(int[] A) {
//[-1, -2, -3, 4, 5]
//[-1, 4, -2, 5, -3]
//
// write your code here
int numPos = 0;
int numNeg = 0;
int alen = A.length;
for(int i=0;i<alen;i++){
if(A[i] > 0){
numPos++;
}else{
numNeg++;
}
}
//place majority of signs on the left, the minority on the right.
partition(A, numPos > numNeg);
// System.out.printf(Arrays.toString(A));
int left = 1;
int right = numPos == numNeg? alen - 2: alen - 1;
while(left < right){
int tmp = A[left];
A[left] = A[right];
A[right] = tmp;
left += 2;
right -= 2;
}
}
private void partition(int[] nums, boolean majorityPos){
int flag = majorityPos? 1: -1;
int left = 0;
int right = nums.length - 1;
while(left <= right){
while(left <= right && nums[left] * flag > 0){
left++;
}
while(left <= right && nums[right] * flag < 0){
right--;
}
if(left <= right){
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
}
}
}