import java.util.*;
public class Rank {
public int[] getRankOfNumber(int[] A, int n) {
// write code here
int[] result = new int[n];
result[0] = 0;
for (int i = 1; i < result.length; i++) {
int count = 0;
for (int j = 0; j < i; j++) {
if(A[j]<=A[i])count++;
}
result[i] = count;
}
return result;
}
}
运行时间262ms
如果数组的个数很大的话,最好就是用二叉查找树
二叉查找树-节点属性
1. 当前节点的值
2. 左结点索引
3. 右节点索引
4. 当前节点的左边子节点数量
二叉查找树-节点方法
1. 在当前节点上插入新的节点
2. 获取当前节点的秩
使用二叉查找树的代码:
import java.util.*;
public class Rank {
Node root =null;
public int[] getRankOfNumber(int[] A, int n) {
int[] result = new int[n];
for (int i = 0; i < A.length; i++) {
if(root==null) {
root = new Node(A[i]);
}else {
root.insert(A[i]);
}
result[i] = root.getRank(A[i]);
}
return result;
}
public class Node{
int val;
int leftsize=0;
Node left;
Node right;
public Node(int v) {
this.val = v;
}
public void insert(int v) {
if(this.val>=v) {
if(this.left!=null) {
this.left.insert(v);
}else {
this.left = new Node(v);
}
leftsize++;
}else {
if(this.right!=null) {
this.right.insert(v);
}else {
this.right = new Node(v);
}
}
}
//给一个值,获取这个值所在节点的秩
public int getRank(int v) {
if(v==this.val) {
return this.leftsize;
}else if(v<this.val) {
return this.left.getRank(v);
}else {
return this.leftsize+1+this.right.getRank(v);
}
}
}
}
运行时间:153ms
运行速度比for循环快一倍