看電影,儘量看多的電影
[start,end],start 電影開始的時間,end 電影結束的時間
public class Movice {
public int start;
public int end;
public Movice(int start,int end){
this.start = start;
this.end = end;
}
public boolean isIn(int o){
if(o < end && o > start){
return true;
}
return false;
}
}
複製程式碼
public class FindMaxMovices {
public int findMaxMovices(ArrayList<Movice> movices){
Comparator<Movice> comparator = new Comparator<Movice>() {
@Override
public int compare(Movice o1, Movice o2) {
return o1.end - o2.end;
}
};
int count = 0;
Collections.sort(movices,comparator);
for (int i = 0 ; i < movices.size();i++){
count++;
int end = movices.get(i).end;
for(int j = i + 1; j < movices.size(); j++){
if(movices.get(j).isIn(end)){
i = j;
}
}
}
return count;
}
public static void main(String[] args) {
FindMaxMovices findMaxMovices = new FindMaxMovices();
int[][] movice = {{1,3},{2,4},{4,7},{5,6},{6,10},{3,9}};
ArrayList<Movice> movices = new ArrayList<>();
for(int i = 0 ; i < movice.length; i++){
movices.add(new Movice(movice[i][0],movice[i][1]));
}
System.out.println(findMaxMovices.findMaxMovices(movices));
}
}
複製程式碼
找到二叉樹兩個節點的最長距離
程式設計之美原題
解法一:
對於任意一個節點,以該節點為根,假設這個根有K個孩子節點,那麼相距最遠的兩個節點U和V之間的路徑與這個根節點的關係有兩種情況: 1.若路徑經過根Root,則U和V是屬於不同子樹的,且它們都是該子樹中到根節點最遠的節點,否則跟它們的距離最遠相矛盾。 2.如果路徑不經過Root,那麼它們一定屬於根的K個子樹之一。並且它們也是該子樹中相距最遠的兩個頂點。
因此,問題就可以轉化為在子樹上的解,從而能夠利用動態規劃來解決。
設第K棵子樹中相距最遠的兩個節點:Uk和Vk,其距離定義為d(Uk,Vk),那麼節點Uk或Vk即為子樹K到根節點Rk距離最長的節點。不失一般性,我們設Uk為子樹K中到根節點Rk距離最長的節點,其到根節點的距離定義為d(Uk,R)。取d(Ui,R)(1≤i≤k)中最大的兩個值max1和max2,那麼經過根節點R的最長路徑為max1+max2+2,所以樹R中相距最遠的兩個點的距離為:max{d(U1,V1),…,d(Uk,Vk),max1+max2+2}
。
只需要遍歷所有的節點一次,時間複雜度為O(|E|)=O(|V|-1),其中V為點的集合,E為邊的集合。
package tree;
/**
* Created by mac on 2018/7/10.
*/
public class FindMaxLen {
int nMaxLen = 0;
//尋找樹中最長的兩段距離
void FindMaxLen(Node pRoot){
if(pRoot == null){
return;
}
//如果左子樹為空,那麼該節點的左邊最長距離為0
if(pRoot.pLeft == null){
pRoot.nMaxLeft = 0;
}
//如果右子樹為空,那麼該節點的右邊最長距離為0
if(pRoot.pRight == null){
pRoot.nMaxRight = 0;
}
//如果左子樹不為空,遞迴尋找左子樹最長距離
if(pRoot.pLeft != null){
FindMaxLen(pRoot.pLeft);
}
//如果右子樹不為空,遞迴尋找右子樹最長距離
if(pRoot.pRight != null){
FindMaxLen(pRoot.pRight);
}
//計算左子樹最長節點距離
if(pRoot.pLeft != null){
int nTempMax = 0;
if(pRoot.pLeft.nMaxLeft > pRoot.pLeft.nMaxRight){
nTempMax = pRoot.pLeft.nMaxLeft;
}else{
nTempMax = pRoot.pLeft.nMaxRight;
}
pRoot.nMaxLeft = nTempMax + 1;
}
//計算右子樹最長節點距離
if(pRoot.pRight != null){
int nTempMax = 0;
if(pRoot.pRight.nMaxLeft > pRoot.pRight.nMaxRight){
nTempMax = pRoot.pRight.nMaxLeft;
}else{
nTempMax = pRoot.pRight.nMaxRight;
}
pRoot.nMaxRight = nTempMax + 1;
}
if(pRoot.nMaxLeft + pRoot.nMaxRight > nMaxLen){
nMaxLen = pRoot.nMaxLeft + pRoot.nMaxRight;
}
}
}
複製程式碼
改變兩個數字,a,b,不用額外的空間
a = a + b;
b = a - b;
a = a - b;
複製程式碼
用hashmap,arraylist實現set,實現方法insert,delete,getrandom 複雜度O(1)
leetcode原題 Insert Delete GetRandom O(1)
兩個hashmap
class RandomizedSet {
HashMap<Integer, Integer> map1;
HashMap<Integer, Integer> map2;
Random rand;
/** Initialize your data structure here. */
public RandomizedSet() {
map1 = new HashMap<Integer, Integer>();
map2 = new HashMap<Integer, Integer>();
rand = new Random(System.currentTimeMillis());
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
if(map1.containsKey(val)){
return false;
}else{
map1.put(val, map1.size());
map2.put(map2.size(), val);
}
return true;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
if(map1.containsKey(val)){
int index = map1.get(val);
//remove the entry from both maps
map1.remove(val);
map2.remove(index);
if(map1.size()==0){
return true;
}
//if last is deleted, do nothing
if(index==map1.size()){
return true;
}
//update the last element's index
int key1 = map2.get(map2.size());
map1.put(key1, index);
map2.remove(map2.size());
map2.put(index, key1);
}else{
return false;
}
return true;
}
/** Get a random element from the set. */
public int getRandom() {
if(map1.size()==0){
return -1;
}
if(map1.size()==1){
return map2.get(0);
}
return map2.get(new Random().nextInt(map1.size()));
//return 0;
}
}
/**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet obj = new RandomizedSet();
* boolean param_1 = obj.insert(val);
* boolean param_2 = obj.remove(val);
* int param_3 = obj.getRandom();
*/
複製程式碼
//一個hashmap 一個 arraylist
class RandomizedSet {
Map<Integer, Integer> map;
List<Integer> list;
Random random;
/** Initialize your data structure here. */
public RandomizedSet() {
map = new HashMap<>();
random = new Random();
list = new ArrayList<>();
}
/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
public boolean insert(int val) {
if (!map.containsKey(val)) {
map.put(val, list.size());
list.add(val);
return true;
}
return false;
}
/** Removes a value from the set. Returns true if the set contained the specified element. */
public boolean remove(int val) {
if (!map.containsKey(val)) return false;
int index = map.get(val);
if (index < list.size() - 1) {
int num = list.get(list.size() - 1);
list.set(index, num);
map.put(num, index);
}
map.remove(val);
list.remove(list.size() - 1);
return true;
}
/** Get a random element from the set. */
public int getRandom() {
return list.get(random.nextInt(list.size()));
}
}
/**
* Your RandomizedSet object will be instantiated and called as such:
* RandomizedSet obj = new RandomizedSet();
* boolean param_1 = obj.insert(val);
* boolean param_2 = obj.remove(val);
* int param_3 = obj.getRandom();
*/
複製程式碼
java 和 javascript的比較
由Netscape,Inc。開發的JavaScript程式語言不是Java平臺的一部分。
JavaScript不會建立applet或獨立應用程式。 在最常見的形式中,JavaScript駐留在HTML文件中,並且可以為使用簡單HTML無法實現的網頁提供互動級別。
Java和JavaScript之間的主要區別:
- Java是一種OOP程式語言,而Java Script是一種OOP指令碼語言。
- Java建立在虛擬機器或瀏覽器中執行的應用程式,而JavaScript程式碼僅在瀏覽器上執行。
- 需要編譯Java程式碼,而JavaScript程式碼全部都是文字。
- 它們需要不同的外掛。
javascript的4個特性
1.瀏覽器支援 要訪問Flash內容,您需要在瀏覽器中安裝Flash外掛。但是要使用javascript,您根本不必使用任何外掛。這是因為所有瀏覽器都接受了javascript作為它們的指令碼語言,併為它提供了整合支援。您需要做的就是正確處理一些依賴於不同瀏覽器的DOM(文件物件模型)的任務。
2.可以在客戶端和伺服器端使用 由於javascript可以訪問瀏覽器的Document物件模型,因此您可以在執行時實際更改Web頁面的結構。因此,javascript可用於為網頁新增不同的效果。另一方面,javascript也可以在伺服器端使用。例如,在Alfresco這是一個流行的開源企業內容管理系統,javascript用於建立webscripts。這使得向露天新增自定義任務變得非常簡單。
3.函數語言程式設計語言 在javascript中,函式可以像任何其他資料型別一樣分配給變數。不僅如此,函式還可以接受另一個函式作為引數,也可以返回一個函式。你也可以擁有沒有名字的功能。顯然,這使您能夠以函數語言程式設計風格進行編碼。
4.支援物件 Javascript是一種物件導向的語言。但是,javascript處理物件和繼承的方式與傳統的物件導向程式語言(如Java)略有不同。因此,javascript支援大多數物件導向的概念,同時易於學習和使用。
這些功能使javascript能夠處理簡單和複雜的任務。因此,javascript一直是最流行的程式語言。對於想要學習計算機程式設計的人來說,它也是一門很好的語言,因為它支援物件導向以及功能概念並使用它,你只需要一個瀏覽器和一個文字編輯器。