第一题
leetcode204:计数质数
public class 第一题09 {
public static int countPrimes(int n) {
if(n < 3){
return 0;
}
int count = n / 2;
boolean[] f = new boolean[n];
for (int i = 3;i * i < n;i += 2){
if (f[i]){
continue;
}
for (int j = i * i;j < n;j += 2 * i){
if (!f[j]){
count--;
f[j] = true;
}
}
}
return count;
}
}
第二题
import java.util.Arrays;
public class 第二题09 {
//暴力递归
public static int ways1(int[] arr,int m){
if (arr == null || arr.length == 0){
return 0;
}
return process(arr,0,m);
}
private static int process(int[] arr, int index, int m) {
if (index == arr.length){
for (int i = 1;i < index;i++){
if (arr[i - 1] > arr[i] + m){
return 0;
}
}
return 1;
}
int ans = 0;
for (int i = index;i < arr.length;i++){
swap(arr,index,i);
ans += process(arr,index + 1,m);
swap(arr,index,i);
}
return ans;
}
private static void swap(int[] arr, int index, int i) {
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
//
public static int ways2(int[] arr,int m){
if (arr == null || arr.length == 0){
return 0;
}
Arrays.sort(arr);
int pre = 1;
for (int i = 1;i < arr.length;i++){
int temp = arr[i];
int p1 = pre;
int count = findCount(arr,temp - m,i);
int p2 = count * pre;
// int p2 = arr[0..i]之间有多少大于等于arr[i] - m的数;
int cur = p1 + p2;
pre = cur;
}
return pre;
}
private static int findCount(int[] arr, int target,int i) {
int count = 0;
for (int j = i - 1;j >= 0;j--){
if (target > arr[j]){
break;
}
count++;
}
return count;
/*int l = 0;
int r = i - 1;
while (l < r){
int mid = (l + r) / 2;
if (arr[mid] == target){
while (mid > l && arr[mid] == target) {
mid = mid - 1;
}
return mid;
}else if (arr[mid] < target){
l = mid + 1;
}else {
r = mid;
}
}
return r - 1;*/
}
public static void main(String[] args) {
int arr[] = {5,7,6,1,2,3,4};
int res1 = ways1(arr, 2);
int res2 = ways2(arr, 2);
System.out.println(res1 + " " + res2);
}
}
第三题
leetcode 198:打家劫舍
leetcode 213. 打家劫舍 II
思路:动态规划
public class 第三题09 {
//打家劫舍
public static int rob1(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
dp[0] = nums[0];
for (int i = 1;i < n;i++){
if (i == 1){
dp[i] = Math.max(dp[i - 1],nums[1]);
}else {
dp[i] = Math.max(Math.max(dp[i - 1],dp[i - 2] + nums[i]),nums[i]);
}
}
return dp[n - 1];
}
//打家劫舍2
public static int rob2(int[] nums) {
if (nums == null || nums.length < 2){
return nums[0];
}
if (nums.length < 3){
return Math.max(nums[0],nums[1]);
}
int n = nums.length;
int pre1 = nums[0];
int pre2 = Math.max(nums[0],nums[1]);
int max1 = Math.max(nums[0],nums[1]);
for (int i = 2;i < n - 1;i++){
max1 = Math.max(nums[i],Math.max(pre1 + nums[i],pre2));
pre1 = pre2;
pre2 = max1;
}
pre1 = nums[1];
pre2 = Math.max(nums[1],nums[2]);
int max2 = Math.max(nums[1],nums[2]);
for (int i = 3;i < n;i++){
max2 = Math.max(nums[i],Math.max(pre1 + nums[i],pre2));
pre1 = pre2;
pre2 = max2;
}
return Math.max(max1,max2);
}
}
第四题
leetcoede277. 搜寻名人
public class 第四题09 {
//题目给的函数:判断x认不认识y
public static boolean konw(int x,int y){
return true;
}
public static int findCelebrity(int n) {
int res = 0;
for (int i = 0;i < n;i++){
if (konw(res,i)){
res = i;
}
}
for (int i = 0;i < res;i++){
if (konw(res,i)){
return -1;
}
}
for (int i = 0;i < n;i++){
if (!konw(i,res)){
return -1;
}
}
return res;
}
}